2014-09-25 68 views
0

我正在研究一个项目,其中有一个数组变量突然包含与另一个相同的问题。随着懒惰的人的警告提示的帮助下,我已经缩小的问题降到这段代码,这里的一切突然出错:链接在一起的JavaScript变量没有很好的理由

// 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改变的内容。为什么??? 变量没有链接在一起! 我在想我错过了某处明显的东西。我只是需要一个聪明的人看到它:)

+1

'slice()'拷贝数组,但不是其中的值。 'showsVars [x]'和'allShowsVars [x]'仍然指向同一个对象。 – georg 2014-09-25 08:09:22

+0

非常感谢。我错过了那个小细节。 – markj 2014-09-25 08:56:03

回答

1

这是来自MDN的documentation of Array.prototype.slice()

对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都指向同一个对象。如果引用的对象发生更改,则这些更改对新数组和原始数组均可见。

这是发生在你的情况。

你可以使用这个技巧来深复制一个数组:

var deepCopy = JSON.parse(JSON.stringify(sourceArray)); 

的JavaScript数组/对象的深度复制见herehere

+0

接受,因为它是解决方案最全面的答案。非常感谢你。 – markj 2014-09-25 09:01:47

+1

刚刚发现这一个,这真的给了一些很好的见解以及速度比较:http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object – markj 2014-09-25 09:31:17

2

slice()只执行浅拷贝。原始值直接被复制,但嵌套对象在内部被视为引用,因此两个数组最终指向相同的对象。

+0

谢谢。这也是一个很好的解释。 – markj 2014-09-25 09:03:02

相关问题