Tôi có một mảng email (có thể chỉ là 1 email hoặc 100 email) và tôi cần gửi mảng với yêu cầu ajax (tôi biết làm thế nào để làm), nhưng tôi chỉ có thể gửi một mảng có 10 hoặc ít hơn e-mail trong đó. Vì vậy, nếu có một mảng ban đầu của 20 e-mail tôi sẽ cần phải chia chúng thành 2 mảng 10 mỗi. hoặc nếu có 15 e-mail trong mảng ban đầu, sau đó 1 mảng của 10, và một mảng khác của 5. Tôi đang sử dụng jQuery, những gì sẽ là cách tốt nhất để làm điều này?Cách chia mảng dài thành các mảng nhỏ hơn, với JavaScript
Trả lời
không sử dụng jquery ... sử dụng đồng bằng javascript
var a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var b = a.splice(0,10);
//a is now [11,12,13,14,15];
//b is now [1,2,3,4,5,6,7,8,9,10];
Bạn có thể lặp lại thao tác này để có được hành vi bạn muốn.
var a = YOUR_ARRAY;
while(a.length) {
console.log(a.splice(0,10));
}
Điều này sẽ cung cấp cho bạn 10 thành phần cùng một lúc ... nếu bạn có 15 phần tử, bạn sẽ nhận được 1-10, mức 11-15 như bạn muốn.
Chỉ cần lặp qua mảng, nối nó cho đến khi tất cả được tiêu thụ.
var a = ['a','b','c','d','e','f','g']
, chunk
while (a.length > 0) {
chunk = a.splice(0,3)
console.log(chunk)
}
đầu ra
[ 'a', 'b', 'c' ]
[ 'd', 'e', 'f' ]
[ 'g' ]
Giả sử bạn không muốn để tiêu diệt các mảng ban đầu, bạn có thể sử dụng mã như thế này để phá vỡ các mảng dài vào mảng nhỏ mà sau đó bạn có thể duyệt qua:
var longArray = []; // assume this has 100 or more email addresses in it
var shortArrays = [], i, len;
for (i = 0, len = longArray.length; i < len; i += 10) {
shortArrays.push(longArray.slice(i, i + 10));
}
// now you can iterate over shortArrays which is an
// array of arrays where each array has 10 or fewer
// of the original email addresses in it
for (i = 0, len = shortArrays.length; i < len; i++) {
// shortArrays[i] is an array of email addresss of 10 or less
}
Là một bổ sung @ của answer jyore, và trong trường hợp bạn vẫn muốn giữ lại các mảng ban đầu:
var originalArray = [1,2,3,4,5,6,7,8];
var splitArray = function (arr, size) {
var arr2 = arr.slice(0),
arrays = [];
while (arr2.length > 0) {
arrays.push(arr2.splice(0, size));
}
return arrays;
}
splitArray(originalArray, 2);
// originalArray is still = [1,2,3,4,5,6,7,8];
Bạn có thể sử dụng lodash: https://lodash.com/docs
_.chunk(['a', 'b', 'c', 'd'], 2);
// → [['a', 'b'], ['c', 'd']]
Bạn có thể có một cái nhìn tại mã này. Đơn giản và hiệu quả.
function chunkArrayInGroups(array, unit) {
var results = [],
length = Math.ceil(array.length/unit);
for (var i = 0; i < length; i++) {
results.push(array.slice(i * unit, (i + 1) * unit));
}
return results;
}
chunkArrayInGroups(["a", "b", "c", "d"], 2);
Nếu bạn muốn có một phương pháp mà không sửa đổi các mảng hiện có, hãy thử này:
let oldArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
let newArray = [];
let size = 3; // Size of chunks you are after
let j = 0; // This helps us keep track of the child arrays
for (var i = 0; i < oldArray.length; i++) {
if (i % size === 0) {
j++
}
if(!newArray[j]) newArray[j] = [];
newArray[j].push(oldArray[i])
}
Một thực hiện:
const arr = ["H", "o", "w", " ", "t", "o", " ", "s", "p", "l", "i", "t", " ", "a", " ", "l", "o", "n", "g", " ", "a", "r", "r", "a", "y", " ", "i", "n", "t", "o", " ", "s", "m", "a", "l", "l", "e", "r", " ", "a", "r", "r", "a", "y", "s", ",", " ", "w", "i", "t", "h", " ", "J", "a", "v", "a", "S", "c", "r", "i", "p", "t"];
const size = 3;
const res = arr.reduce((acc, curr, i) => {
if (!(i % size) ) { // if index is 0 or can be divided by the `size`...
acc.push(arr.slice(i, i + size)); // ..push a chunk of the original array to the accumulator
}
return acc;
}, []);
// => [["H", "o", "w"], [" ", "t", "o"], [" ", "s", "p"], ["l", "i", "t"], [" ", "a", " "], ["l", "o", "n"], ["g", " ", "a"], ["r", "r", "a"], ["y", " ", "i"], ["n", "t", "o"], [" ", "s", "m"], ["a", "l", "l"], ["e", "r", " "], ["a", "r", "r"], ["a", "y", "s"], [",", " ", "w"], ["i", "t", "h"], [" ", "J", "a"], ["v", "a", "S"], ["c", "r", "i"], ["p", "t"]]
NB - Điều này không sửa đổi các mảng ban đầu .
Hoặc, nếu bạn muốn có một chức năng, bất biến và khép kín phương pháp:
function splitBy(size, list) {
return list.reduce((acc, curr, i, self) => {
if (!(i % size) ) {
return [
...acc,
self.slice(i, i + size),
];
}
return acc;
}, []);
}
Phương pháp khác:
var longArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var size = 2;
var newArray = new Array(Math.ceil(longArray.length/size)).fill("")
.map(function() { return this.splice(0, size) }, longArray.slice());
// newArray = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]];
này không ảnh hưởng đến các mảng ban đầu như một bản sao, được làm bằng slice, được chuyển vào đối số 'this' của bản đồ.
thi khác, sử dụng Array.reduce (Tôi nghĩ rằng đó là người duy nhất còn thiếu!):
const splitArray = (arr, size) =>
{
if (size === 0) {
return [];
}
return arr.reduce((split, element, index) => {
index % size === 0 ? split.push([element]) : split[Math.floor(index/size)].push(element);
return split;
}, []);
};
Như nhiều giải pháp trên, này không phá hủy một. Trả về một mảng trống khi kích thước bằng 0 chỉ là một quy ước. Nếu khối if
bị bỏ qua, bạn sẽ gặp lỗi, có thể là lỗi bạn muốn.
Đây là một đơn giản lót
var segment = (arr, n) => arr.reduce((r,e,i) => i%n ? (r[r.length-1].push(e), r)
: (r.push([e]), r), []),
arr = Array.from({length: 31}).map((_,i) => i+1);
console.log(segment(arr,7));
Tôi muốn chia sẻ giải pháp của tôi là tốt. Đó là một chút chi tiết hơn nhưng hoạt động là tốt.
var data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
var chunksize = 4;
var chunks = [];
data.forEach((item)=>{
if(!chunks.length || chunks[chunks.length-1].length == chunksize)
chunks.push([]);
chunks[chunks.length-1].push(item);
});
console.log(chunks);
Output (định dạng):
[ [ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15 ] ]
function chunkArrayInGroups(arr, size) {
var newArr=[];
for (var i=0; arr.length>size; i++){
newArr.push(arr.splice(0,size));
}
newArr.push(arr.slice(0));
return newArr;
}
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3);
đừng quên thực hiện: newArr = [] biến cục bộ – zgthompson
Các câu trả lời chỉ có mã có xu hướng bị gắn cờ và sau đó bị xóa là Chất lượng thấp. Bạn có thể cung cấp một số bình luận về cách giải quyết vấn đề ban đầu này? – Graham
- 1. chia mảng thành các phần nhỏ hơn
- 2. Mảng 2d cắt thành các mảng 2d nhỏ hơn
- 3. PHP - Chia nhỏ từ thành mảng
- 4. Thuật toán để chia nhỏ mảng thành các mảng phụ đồng đều
- 5. mảng Chia thành hai mảng
- 6. Javascript: chia chuỗi thành mảng 2ngày
- 7. C#: Chia mảng thành n phần
- 8. Cách tốt hơn để ghép một mảng thành một mảng trong javascript
- 9. Chia nhỏ hơn Multiply?
- 10. Cách chia nhỏ chức năng chạy dài trong javascript, nhưng giữ hiệu suất
- 11. Cách chia ảnh thành nhiều ảnh nhỏ hơn
- 12. Javascript: Chuyển văn bản thành một mảng
- 13. Cách tốt nhất để tách một vector thành hai mảng nhỏ hơn là gì?
- 14. Chia mảng thành mảng phụ dựa trên giá trị
- 15. Python tạo một mảng phụ nhỏ hơn từ mảng 2D NumPy lớn hơn?
- 16. Cách chia NSString dài thành các trang
- 17. Cách tách các routes.rb thành các tệp nhỏ hơn
- 18. C chia mảng char thành các biến khác nhau
- 19. Mẫu Django - chia chuỗi thành mảng
- 20. chia mảng thành mảng phụ theo bước trong Ruby
- 21. Kiểm tra Chiều dài đa chiều Mảng với Javascript
- 22. Chia bảng lớn thành nhiều bảng nhỏ hơn
- 23. Sắp xếp Mảng Mảng theo chiều dài với mã vạch
- 24. Chia danh sách các số thành danh sách nhỏ hơn với "tổng" xấp xỉ
- 25. Chia Chuỗi thành Mảng trong Flex
- 26. chia mảng thành từng mảnh trong MATLAB
- 27. Chiều dài mảng của mảng Array.pop() không?
- 28. chuỗi Chia thành vào mảng các cặp nhân vật
- 29. C - chia chuỗi thành một mảng các chuỗi
- 30. Tại sao viết nhiều mảng byte nhỏ vào một tệp nhanh hơn viết một mảng lớn?
Lưu ý rằng YOUR_ARRAY cũng sẽ được tiêu thụ (mảng là đối tượng ...) – Claudio
Vâng, tôi đã đặt nó bởi vì không có tính mô tả, và tôi đã viết ví dụ bằng cách sử dụng ... đó là một dòng hoàn toàn không cần thiết mã ... Mặc dù, điều đó làm cho tôi nghĩ ... nếu sử dụng mẫu này, bạn có thể muốn làm một bản sao sâu vào một mảng làm việc để không làm gián đoạn bạn gốc – jyore
Dễ dàng .... cảm ơn! – Bill