将多个元素添加到所有相等的数组中[重复]

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(...))。

【问题讨论】:

你为什么需要这样的东西? @thefourtheye 1.js 导出包含模块中使用的数组的对象。 2.js 想要修改该数组,因此 1.js 将使用 2.js 数据。这是我的情况。 如果AB 引用同一个数组,那么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.length0 分别表示数组的起始位置和要删除的元素数。

我们将它与要插入的实际元素数组连接起来。因此,传递给A.splice 的参数看起来像这样

A.splice(A.length, 0, 1, 2);

由于splice 进行就地操作,AB 仍然引用同一个对象。

【讨论】:

以上是关于将多个元素添加到所有相等的数组中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c/c++ 去除数组中重复的元素

有重复元素的排列问题

453. 最小移动次数使数组元素相等(数学)

最小化操作次数使数组的所有元素相等

检查数组中所有元素是不是相等的最快方法

C ++如何检查数组中的元素是不是相等?