将多个元素添加到所有相等的数组中[重复]
Posted
技术标签:
【中文标题】将多个元素添加到所有相等的数组中[重复]【英文标题】:Add multiple elements into all arrays that are equal [duplicate] 【发布时间】:2014-07-14 06:00:25 【问题描述】:$ node
> A = [0, 1, 23]
[ 0, 1, 23 ]
> B = A
[ 0, 1, 23 ]
> A.splice(0, 3)
[ 0, 1, 23 ]
> B
[]
> A
[]
> A = A.concat([1, 2])
[ 1, 2 ]
> B
[]
这是正确的。但是,有没有可能在调用concat
之后,B
数组等于A
?
我知道有循环解决方案,但是还有什么其他替代方法可以在多个相等的数组中添加多个元素?
顺便说一句,我不想直接修改B
(A = B = A.concat(...)
)。
【问题讨论】:
你为什么需要这样的东西? @thefourtheye1.js
导出包含模块中使用的数组的对象。 2.js
想要修改该数组,因此 1.js
将使用 2.js
数据。这是我的情况。
如果A
和B
引用同一个数组,那么A.push(element)
也会出现在B
中。
@Paul 没错。但我想插入多个元素。 A = A.contact(...)
不起作用,因为引用将被更改。 A.push(...);A.push(...);A.push(...)...
也会更改 B
,但我猜代码不会是最好的。
@ionica 看到本杰明的回答。对于添加多个元素,Function.apply 是与Array.push 一起使用的好帮手
【参考方案1】:
Paul 是对的,你可以这样做:
A.push.apply(A,[1, 2]);
对于那些不知道的人,Array#push
接受可变参数,Function#apply
将可变参数接受函数转换为数组接受函数。
【讨论】:
哦,好主意! 它也比其他方法快得多,除了内联 for 循环 - 这就是为什么你会看到这个技巧经常与arguments
对象在性能敏感代码中的 .slice 或 .splice 一起使用(同样,内联 for 循环更快)【参考方案2】:
你可以使用Array.prototype.splice
本身,像这样
var A = [0, 1, 23], B = A;
A.splice.apply(A, [A.length, 0].concat([1, 2]));
console.log(A, B, A === B);
// [ 0, 1, 23, 1, 2 ] [ 0, 1, 23, 1, 2 ] true
这里,A.length
和 0
分别表示数组的起始位置和要删除的元素数。
我们将它与要插入的实际元素数组连接起来。因此,传递给A.splice
的参数看起来像这样
A.splice(A.length, 0, 1, 2);
由于splice
进行就地操作,A
和B
仍然引用同一个对象。
【讨论】:
以上是关于将多个元素添加到所有相等的数组中[重复]的主要内容,如果未能解决你的问题,请参考以下文章