如何更新一个Javascript对象数组而不更新另一个

时间:2014-10-28 05:57:53

标签: javascript arrays

我创建了一个带有一些值的对象数组。然后我创建了另一个对象数组并用第一个对象数组进行初始化。然后我在第二个数组中推送了一个值,并且控制台记录了两个数组。两个数组都具有相同的值。为什么会发生这种情况?我们如何阻止这种情况?

我的代码:

var a = { "filters": [] }; // 1st object array
var keyValue = {};
// pushed 2 values in "a" array
keyValue["abc"] = "123";
a.filters.push(keyValue);
keyValue["def"] = "456";
a.filters.push(keyValue);
var b = a; // created another object array & initialized it with "a" array
var keyValue1 = {};
// pushed 1 value in "b" array
keyValue1["ghi"] = "789";
b.filters.push(keyValue1);
console.log(a);
console.log(b);

这会打印a和b的相同值 如何在不更新第一个数组的情况下将值推入第二个数组?

4 个答案:

答案 0 :(得分:1)

对象的var b = a分配会创建一个对象' b'它通常引用(就像指针一样)指向' a'的相同位置。您可能会发现此link有用。

但是,您可以使用切片方法创建/克隆新数组。 var b = a.slice()

答案 1 :(得分:0)

当你说:

时,两者都指向内存中的相同值
var b = a;

因此,如果您更改a,b将受到影响,反之亦然,您需要使用循环进行复制。

修改

使用我从this post

获得的这行代码
var b= a.slice(0); 

答案 2 :(得分:0)

您可以使用

var b = JSON.parse(JSON.stringify(a));

https://stackoverflow.com/a/4591639/1623259

答案 3 :(得分:0)

在JavaScript中(与大多数语言一样)asigment它是别名:

var b = a;

不制作副本。

要制作副本,您必须重新创建对象:

var b = Object.create(a); // clone... a is used as protype
// filters points to the same value in memory

一种选择是创建新的过滤器副本:

var b = Object.create(a);
b.filters = a.filters.slice();

另一种看似效率不高的“hacky”选项:

var b = JSON.parse(JSON.stringify(a));