Tôi đã thêm giải pháp này vào jspref của @dystroy tại đây và nó dường như chạy nhanh gấp đôi so với các giải pháp khác. Chỉnh sửa: Trong Safari & Chrome nhưng không phải FirefoxEdit: in Safari & Chrome but not Firefox
Dưới đây là giải pháp phong cách chức năng để thêm vào sự kết hợp của các câu trả lời ở đây.
Đây là một hàm bậc cao hơn gọi là function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 3 trả về một cuộc gọi lại cho phương thức giảm của UnderCore hoặc phương thức giảm mảng gốc.
Ví dụ sử dụng:
[1,2,3,4,5,6,7,8,9].reduce( toPartitions( 3 ), [] );Chức năng:
function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; }Giống như phân vùng của Clojure, nó sẽ không bao gồm phân vùng đuôi khi không có đủ các yếu tố.
Trong ví dụ của bạn, bạn có thể làm:
arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) );Nếu bạn không muốn sử dụng điều này với function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 4, nhưng chỉ có một hàm có một mảng và kích thước phân vùng bạn có thể làm:
function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); }Do đó, giải pháp sẽ chỉ là:
arrayALLPartionned = partition( arrayAll, 3 );Trong bài viết này, chúng tôi sẽ trải qua cách phân vùng một mảng dựa trên điều kiện chỉ sử dụng dòng mã trong JavaScript. Đây là đoạn mã JavaScript một dòng sử dụng một trong những tính năng ES6 phổ biến nhất => function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 5.
Hãy xác định chức năng ngắn này:
const partition = (arr, criteria) => arr.reduce((acc, i) => (acc[criteria(i) ? 0 : 1].push(i), acc), [[], []]);#Example
partition([1, 2, 3, 4, 5], n => n % 2); // [[2, 4], [1, 3, 5]]
Sử dụng hàm mảng.
let large = [12, 5, 8, 130, 44].filter((x) => x > 10); let small = [12, 5, 8, 130, 44].filter((x) => !(x > 10));Tuy nhiên, trong ví dụ trên, tôi lặp đi lặp lại mảng hai lần và thực hiện cùng một bài kiểm tra mỗi lần. Có cách nào đơn giản để tạo ra cả 'lớn' và 'nhỏ' trong một lần vượt qua mảng không? Cụ thể, nếu cuộc gọi lại để đánh giá xem một phần tử có nên được giữ không, tôi muốn tránh gọi nó hai lần.
Giới thiệu
Mảng là một trong những cấu trúc được sử dụng nhiều nhất trong lập trình JavaScript, đó là lý do tại sao điều quan trọng là phải biết các phương pháp tích hợp của nó như mặt sau túi của bạn.
Trong hướng dẫn này, chúng ta sẽ xem cách chia một mảng thành các khối có kích thước function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 6 trong JavaScript.
Cụ thể, chúng ta sẽ xem xét hai cách tiếp cận:
- Sử dụng phương pháp function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7 và vòng lặp function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 8
- Sử dụng phương thức function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 9 và vòng lặp arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 0
Chia mảng thành các khối thậm chí bằng phương thức Slice ()
Cách dễ nhất để trích xuất một đoạn của một mảng, hay đúng hơn là cắt nó lên, là phương pháp function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7:
arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 2 - Trả về một phần của mảng được gọi, giữa các chỉ số arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 3 và arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 4.
Lưu ý: Cả arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 3 và arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 4 có thể là số nguyên âm, chỉ biểu thị rằng chúng được liệt kê từ cuối mảng. arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 7 là yếu tố cuối cùng của mảng, arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 8 là người tiếp theo cuối cùng, v.v. Both arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 3 and arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 4 can be negative integers, which just denotes that they're enumerated from the end of the array. arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 7 being the last element of the array, arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 8 being the next to last and so on...
Mảng được trả về bởi function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7 trả về một bản sao nông, có nghĩa là bất kỳ tài liệu tham khảo nào trong mảng gốc sẽ được sao chép qua AS-IS và sẽ không phân bổ bộ nhớ cho các đối tượng hoàn toàn mới.
Vì vậy, để cắt một danh sách hoặc mảng thành các khối, hãy sử dụng phương thức function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7:
function sliceIntoChunks(arr, chunkSize) { const res = []; for (let i = 0; i < arr.length; i += chunkSize) { const chunk = arr.slice(i, i + chunkSize); res.push(chunk); } return res; } const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; console.log(sliceIntoChunks(arr, 3));Chạy mã trên mang lại đầu ra sau:
[[ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ], [ 10 ]]Trong mã trên, chúng tôi chia function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 1 thành các khối nhỏ hơn có kích thước function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 2, bằng cách lặp qua mảng và cắt nó mỗi function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 3. Trong lần lặp cuối cùng, sẽ chỉ còn một yếu tố (function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 4), sẽ phải tạo nên đoạn riêng của nó.
Chia mảng thành các khối thậm chí bằng phương thức splice ()
Mặc dù phương pháp function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 9 có vẻ giống với phương pháp function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7, việc sử dụng và tác dụng phụ của nó rất khác nhau. Hãy xem xét kỹ hơn:
function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 0Hãy xem điều này trong hành động thông qua một ví dụ về mã:
Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!
function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 1Chạy mã này mang lại:
function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 2Ở đây chúng tôi đang sử dụng vòng lặp arrayALLPartionned = arrayAll.reduce( toPartitions( 3 ), [] ) ); 0 để đi qua mảng. Trong mỗi lần lặp, chúng tôi thực hiện thao tác nối và đẩy mỗi khối vào một mảng kết quả cho đến khi không còn phần tử nào trong mảng gốc (function partition ( arr, size ) { return arr.reduce( toPartitions( size ), [] ); } 8).
Một điều rất quan trọng cần lưu ý là function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 9 thay đổi mảng ban đầu. Khi function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7 tạo ra một bản sao của mảng gốc, do đó sẽ không có bất kỳ thay đổi nào trong bản gốc.
Sự kết luận
Trong bài viết này, chúng tôi đã xem qua một vài cách dễ dàng để chia một danh sách thành các phần thậm chí trong JavaScript. Trong khi làm như vậy, chúng tôi đã học cách làm việc với một vài phương pháp mảng tích hợp như function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 7 và function toPartitions ( size ) { var partition = []; return function ( acc, v ) { partition.push( v ); if ( partition.length === size ) { acc.push( partition ); partition = []; } return acc; }; } 9.