从一个包含单个值的数组中返回一组新的配对值数组的 JavaScript 实现

8

可能是重复问题:
将数组拆分为块

我正在尝试将一个值数组转换为新的配对值数组。

例如,我需要将以下内容转换为:

var arr = [1,2,3,4,5,6,7,8];

into:

arr = [[1,2], [3,4], [5,6], [7,8]];

我尝试使用jQuery的.map()方法,但是这个方法对我不起作用:

arr= $.map(arr, function(n, i){
return [n + ',' + n[ i + 1 ]];
});

3
map函数返回一个数组时,它会将其展平到新的数组中,你可能希望自己手动实现。 - Andrew
此外,[...].map 是 JavaScript 中的内置函数(ECMAScript 5 版本),被所有现代浏览器支持,除非你算上那些仍然没有点击 Microsoft 强制推荐升级至 IE9 的人。 - ninjagecko
5个回答

10

如果您坚持要使用map,则可以这样做:

arr= $.map(arr, function(n, i){
    if (i%2 === 0) return [[n, arr[ i + 1 ]]];
});

+1 这很好。附注:使用 ===0 进行比较。而使用 {}(虽然不是必需的)是编写清晰代码的好方法。 - Roko C. Buljan
1
使用取模运算是一种简洁的方式来实现这个,但我承认使用for循环似乎更适合这种情况,尽管OP提到了map()函数。还是给一个赞+1。 - adeneo
1
我已经将这个重写为标准的JavaScript,没有使用jQuery,在这里:https://dev59.com/4Goy5IYBdhLWcg3wg-Ym#10456644。 - ninjagecko

7

如果你不想用锤子敲图钉:

var arr = [1,2,3,4,5,6,7,8];

var newarr = new Array();

for (var i=0; i<arr.length; i=i+2) {
    newarr.push(arr.slice(i,i+2));
}

3
您不需要使用 map,您需要使用reduce

这里有一个能够工作的例子:

var endArr = [],
    arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ],
    i = 0;

arr.reduce( function( prev, curr, index ) {
    if ( index % 2 === 0 ) {
        endArr[ i ] = [ prev, curr ];
    }
    i++;
} );

还有一件事我想到了:
var endArr = [],
    arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ];

while ( arr.length ) {
    endArr.push( arr.splice( 0, 2 ) );
}

编辑:Arf,这与Chris Gutierrez的解决方案相同。

3

不要把jQuery用于所有问题:

var arr = [1, 2, 3, 4, 5, 6, 7, 8];
var narr = [];
for (i = 0; i < arr.length; i = i + 2) {
    narr[i / 2] = [arr[i], arr[i + 1]];
}

但是只有当你的 arr 元素数量为偶数时才适用。


3

另一个例子...

var arr = [1 , 2, 3, 4, 5, 6, 7, 8]
var final = []
while(arr.length) {
    final.push(arr.splice(0, 2))
}

刚刚意识到这与Jonathan M的解决方案类似。 - Chris Gutierrez
1
不对呀,你在使用 splice() 而我在使用 slice()。干得好。 - Jonathan M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接