我有
var myFirstArray = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];
我想引用myFirstArray,所以我这样做:
var mySecondArray = myFirstArray;
myFirstArray中的推送,拼接,修改元素将显示在mySecondArray中,但如果我想将该数组重置为其他内容:
myFirstArray = [];
或
myFirstArray = someOtherData;
我的参考文献丢失了。我理解为什么会这样,但我希望mySecondArray
能够随时指出myFirstArray
指向的任何内容。最好的方法是什么?
我的解决方法包括:
// Just empty the array and push it:
while (myFirstArray.length) myFirstArray.pop();
for (var x in data) myFirstArray.push(x);
// Or put the array in an object:
var viewBag = {};
viewBag.myFirstArray = [...];
var mySecondArray = viewBag.myFirstArray;
我不喜欢这两个选项:(
修改:考虑另一种情况:
function doSomethingToMyArray (theArray) {
// Say I get new data that will be formatted the way I want it to be
// Shouldn't I be allowed to do this?
var myNewData = [{ letter: 'd' }];
theArray = myNewData;
}
var myFirstArray = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];
doSomethingToMyArray (myFirstArray);
// At this point, myFirstArray will still be a, b, c instead of d
答案 0 :(得分:1)
为什么不设置myFirstArray只设置mySecondArray?
快速设置变量的一个好建议是这种语法:
var mySecondArray, myFirstArray;
mySecondArray = myFirstArray = ["somevalue"];
在JavaScript中,当你将myFirstArray设置为[],然后将mySecondArray设置为myFirstArray时,它将不会引用第一个变量,但两个变量都将引用相同的实际数组。
答案 1 :(得分:0)
当您将父变量设置为新值时,观察者会丢失并且更改不会应用于该子项。
您需要执行将文件放入数据映射的极其令人讨厌的惯例。
所以,而不是:
var myFirstArray
使用:
$ scope.data = {}; $ scope.data.myFirstArray = blah;
我强烈建议为数据对象提供更智能的名称。
您可能遇到的另一个问题是"点问题",which is explained in this blog post.