2012-02-24 74 views
2

我有这个(子)对象叫做products.original为什么我的原始对象在我将其“复制”到一个新对象后受到影响?

然后我解压到一个新的对象调用productArray

var productArray = []; 

productArray = products.original; 

/*some calculations here*/ 

//sort the object by lowest score 
productArray.sort(function(a, b) {return a.score - b.score;}); 

最后,我在productArray前三细胞中提取到名为resultArray的第三个目的:

var resultArray= [];   
resultArray = productArray.splice(0,3); 

令我惊讶的是,这减少了3(拼接)的长度products.original。为什么?我该怎么做才能阻止呢?提前致谢。

+2

你应该摆脱'= []'。如果要在下一行中将不同的数组分配给该变量,则创建数组并将其分配给变量没有意义。 – Quentin 2012-02-24 10:25:16

回答

2

您没有复制数组,而仅仅是对它的引用。因此,您的所有操作仍在原始对象上执行。 真正的克隆使用slice

productArray = products.original.slice(0); 
+0

只是在代码中看到.splice和no .slice。 – Sirko 2012-02-24 10:24:53

+0

谢谢,我的错。 – pimvdb 2012-02-24 10:25:15

2

试试这个方法:

productArray = products.original.slice(); 

在JavaScript对象是通过引用传递。

2

splice

改变阵列的内容,增加新的元件,同时除去旧元件。

你想slice

返回数组的一部分的一个层次的深层复制。

0

这是预期的JavaScript。 这post将帮助你解决你的问题。

0

productArray = products.original; 

犯规实际上复制products.original到productArray。相反,它复制一个参考。这意味着每次您更改productArray时,您也正在更改原始对象。为了(深)复制一个嵌套的对象,你必须做一些复杂的事情,比如迭代对象的成员,检查它们是数组还是对象(将被引用复制),遍历这些对象并复制简单数据类型。另一种方法是使用提供复制功能的下划线或jquery。从你的排序功能来看,你的数组只包含数字。在这种情况下,slice将会诀窍。

请参阅这里的jQuery例子(Deep) copying an array using jQuery

相关问题