如何使用 JavaScript 将长数组拆分为较小的数组

IT技术 javascript jquery arrays loops
2021-01-29 07:47:34

我有一组电子邮件(可以是 1 封电子邮件,也可以是 100 封电子邮件),我需要使用 ajax 请求发送该数组(我知道该怎么做),但我只能发送一个具有其中包含 10 封或更少的电子邮件。因此,如果有 20 封电子邮件的原始数组,我需要将它们分成 2 个数组,每个数组 10 个。或者,如果原始数组中有 15 封电子邮件,那么 1 个数组为 10,另一个数组为 5。我正在使用 jQuery,那么最好的方法是什么?

6个回答

不要使用 jquery...使用普通的 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];

你可以循环这个以获得你想要的行为。

var a = YOUR_ARRAY;
while(a.length) {
    console.log(a.splice(0,10));
}

这将一次给你 10 个元素......如果你说 15 个元素,你会得到 1-10,你想要的 11-15。

是的,我之所以这么说是因为 a 是非描述性的,而且我已经使用 a 编写了示例...这是完全不必要的代码行...虽然,这让我想到...如果使用这种模式,您可能希望将深度复制到工作阵列中,以免破坏您的原始数据
2021-03-18 07:47:34
请注意, YOUR_ARRAY 也将被消耗(数组是对象...)
2021-03-27 07:47:34
@junvar IDK 如果 1-liner 在 2018 年有效(我严重怀疑它确实有效),但今天它失败了。永远不应该改变(即删除元素)正在迭代的数组,它会抛出索引,即在每次删除后,它应该根据删除的元素数量重新调整,因此它“向前跳过”并且不会消耗完全数组。试试看
2021-04-01 07:47:34
var size = 10; var arrayOfArrays = [];
for (var i=0; i<bigarray.length; i+=size) {
     arrayOfArrays.push(bigarray.slice(i,i+size));
}
console.log(arrayOfArrays);

不同于splice(),slice()对原始数组是非破坏性的。

应该是 i+size 而不是 i+=size
2021-03-15 07:47:34
这个解决方案更好
2021-03-20 07:47:34

只需遍历数组,拼接它,直到它全部被消耗掉。



var a = ['a','b','c','d','e','f','g']
  , chunk

while (a.length > 0) {

  chunk = a.splice(0,3)

  console.log(chunk)

}

输出


[ 'a', 'b', 'c' ]
[ 'd', 'e', 'f' ]
[ 'g' ]

您可以使用 lodash:https ://lodash.com/docs

_.chunk(['a', 'b', 'c', 'd'], 2);
// → [['a', 'b'], ['c', 'd']]

假设您不想破坏原始数组,您可以使用这样的代码将长数组分解为较小的数组,然后您可以对其进行迭代:

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
}