如何在JavaScript中执行“flat push”操作?

33

我想将源数组中的所有单独元素推入目标数组中,

target.push(source);

将源引用放入目标列表中,使用puts命令无法实现此功能。

我想要做的是:

for (i = 0; i < source.length; i++) {
    target.push(source[i]);
}

有没有一种更优雅的方式在JavaScript中实现此操作,而不需要显式编写重复循环?

顺便问一下,这个术语正确吗?我不认为“flat push”是正确的。通过谷歌搜索也没有得到任何关于源数组和目标数组的结果。


所以你希望它的行为像Perl一样?Perl对参数的展平有时很方便,但经常会遇到问题。是的,在Perl中至少被称为“flatten”。 - bart
4个回答

61

apply函数可以实现你所需的功能:

var target = [1,2];
var source = [3,4,5];

target.push.apply(target, source);

alert(target); // 1, 2, 3, 4, 5

MDC - apply

使用提供的数组参数,调用一个函数并指定其this值。


3
在必须保留对原始数组的引用的情况下,这是最佳解决方案。然后,您可以创建一个方法来扩展数组的原型,如下所示:Array.prototype.pushAll = function (items) { Array.prototype.push.apply(this, items); }; - Samuel
你能解释一下它为什么比concat好?concat也会保留引用。 - Noitidart
2
当你阅读JavaScript中concat方法的描述时:“此方法不会更改现有数组,而是返回一个新数组,其中包含连接数组的值。”他们说:“返回一个新数组…” 在这种情况下,如果您尝试在API的beforeSubmit事件中修改数组以添加新项,如果使用concat,您将创建一个新数组,如果尝试用新数组替换现有数组,则API将不会被通知到此更改。 - Samuel
为了深入解释,这里有一点代码(对格式化表示抱歉):var arr = [];arr.push({ name: 'samuel' });add(arr, 'john');console.log(arr.length);function add(arr, newItem){ var newArr = []; newArr.push({ name: newItem }); arr = arr.concat(newArr); }在这种情况下,与concat方法产生1相比,galambalazs的解决方案将产生2的长度。 - Samuel

33

更简单的方法来完成这个任务。

   var arr1 = [1,2,3] 
   var arr2 = [4,5,6] 
   arr1.push(...arr2) //arr1 now contains [1,2,3,4,5,6]

25
你可以使用`concat`方法:链接
var num1 = [1, 2, 3];  
var num2 = [4, 5, 6];  
var num3 = [7, 8, 9];  

// creates array [1, 2, 3, 4, 5, 6, 7, 8, 9]; num1, num2, num3 are unchanged  
var nums = num1.concat(num2, num3);

9
这并不能满足OP的要求。OP想要就地修改数组。 - fool4jesus

9
你可以简单地使用扩展语法:Spread Operator
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];

arr1 = [...arr1, ...arr2];
    // [0, 1, 2, 3, 4, 5]

或者:

var arr1 = ['a', 'b', 'c'];
var arr2 = [1, 2, 3, ...arr1];
        // [1, 2, 3, 'a', 'b', 'c']

演示:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];

arr1 = [...arr1, ...arr2];
console.log(arr1);


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