我正在开发一个项目,其中我遇到一个突然包含与另一个相同的数组变量的问题。在懒人警报提示的帮助下,我将问题缩小到这段代码,一切都突然出错:
// The array "data" is the result of a JSON request - this works fine..
// "data" is a two-dimensional array.
allShowsVars = data.slice();
allShowsVars.sort(function(a, b) {
var aL = a[1].toLowerCase(), bL = b[1].toLowerCase();
if(aL < bL) return -1;
else if(aL > bL) return 1;
else return 0;
});
// At this moment, the allShowsVars variable holds the right contents from the data array..
showsVars = allShowsVars.slice(); // Here, we make a copy of allShowsVars..
for(var iS = 0, sPos; typeof showsVars[iS] != 'undefined'; iS++) {
sPos = showsVars[iS][1].indexOf(" - Season ");
if(sPos != -1) {
showsVars[iS][1] = showsVars[iS][1].slice(0,sPos);
if(iS > 0) {
if(showsVars[(iS-1)][1] == showsVars[iS][1]) showsVars.splice(iS,1);
iS--;
}
}
}
// I changed showsVars in the above for loop, cutting out " - Season ......" in a lot of entries.
现在,allShowsVars还有来自showsVars的新内容。为什么??? 变量没有链接在一起! 我想我错过了一些明显的东西。我只需要一个聪明的人来看它:)
答案 0 :(得分:2)
slice()
仅执行浅拷贝。原始值是直接复制的,但嵌套对象在内部被视为引用,因此两个数组最终都指向相同的对象。
答案 1 :(得分:1)
这是来自MDN的documentation of Array.prototype.slice()。
对于对象引用(而不是实际对象),
slice
将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对新的和原始数组都可见。
这就是你的情况。
您可以使用此hack深度复制数组:
var deepCopy = JSON.parse(JSON.stringify(sourceArray));