js 合并两个数组
1.使用Array.prototype.push apply()
添加第二个数组的所有元素。
arr.push(element1, ..., elementN)
注意当第二个数组(如示例中的moreVegs)太大时不要使用这个方法来合并数组,因为事实上一个函数能够接受的参数个数是有限制的。具体可以参考 apply()
。
var vegetables = ['parsnip', 'potato']; var moreVegs = ['celery', 'beetroot', '3']; // 将第二个数组融合进第一个数组 // 相当于 vegetables.push('celery', 'beetroot'); Array.prototype.push.apply(vegetables, moreVegs); console.log(vegetables); // ['parsnip', 'potato', 'celery', 'beetroot','3']
意:如果按上面方式调用apply
,有超出JavaScript引擎参数长度上限的风险。一个方法传入过多参数(比如一万个)时的后果在不同JavaScript 引擎中表现不同。(JavaScriptCore引擎中有被硬编码的 参数个数上限:65536)。这是因为此限制(实际上也是任何用到超大栈空间的行为的自然表现)是不明确的。一些引擎会抛出异常,更糟糕的是其他引擎会直接限制传入到方法的参数个数,导致参数丢失。比如:假设某个引擎的方法参数上限为2(实际上限当然要高得多), 这种情况下,上面的代码执行后, 真正被传递到 apply
的参数为 'celery', 'beetroot' ,而不是完整的数组。
如果你的参数数组可能非常大,那么推荐使用下面这种混合策略:将数组切块后循环传入目标方法:arr.slice()
2. array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
var vegetables = ['parsnip', 'potato']; var moreVegs = ['celery', 'beetroot', '3']; vegetables.splice(1,0,...moreVegs) console.log(vegetables) //[ 'parsnip', 'celery', 'beetroot', '3', 'potato' ]
3.使用Array.prototype.unshift apply()
添加第二个数组的所有元素。
arr.unshift(element1, ..., elementN)
var vegetables = ['parsnip', 'potato']; var moreVegs = ['celery', 'beetroot', '3']; // 将第二个数组融合进第一个数组 // 相当于 vegetables.unshift('celery', 'beetroot'); Array.prototype.unshift.apply(vegetables, moreVegs); console.log(vegetables); // [ 'celery', 'beetroot', '3', 'parsnip', 'potato' ]
4.使用Array.prototype.concat apply()
添加第二个数组的所有元素。(返回一个浅拷贝,它包含与原始数组相结合的相同元素的副本)
var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])
var vegetables = ['parsnip', 'potato']; var moreVegs = ['celery', 'beetroot', '3']; console.log(Array.prototype.concat.apply(vegetables, moreVegs)); console.log([].concat(vegetables, moreVegs)); // [ 'parsnip', 'potato', 'celery', 'beetroot', '3' ]