2015-02-06 139 views
0

保持javascript參考

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

'myFirstArray.length = 0;'會清除你的兩個數組,如果這是所有你需要做的。如果你想完全替換內容,那麼:'myFirstArray.length = 0; myFirstArray.push.appy(myFirstArray,someOtherData);'。這些都會影響'mySecondArray',只要你讓它引用'myFirstArray'就像你的問題所暗示的那樣。 – DRobinson 2015-02-06 17:28:23

+1

Javascript沒有變量引用。它只有對象和數組的引用。 – Barmar 2015-02-06 17:29:13

+0

Barmar,ok - 那麼你是說當Bar指向一個新的數組/對象時,沒有辦法將引用Foo保存到數組/對象Bar中? – 2015-02-06 17:41:58

回答

1

,只要你設置爲什麼不直接設置mySecondArray myFirstArray?

很好的提示快速設置變量是這樣的語法:

var mySecondArray, myFirstArray; 

mySecondArray = myFirstArray = ["somevalue"]; 

在JavaScript中,當你設置myFirstArray喜歡的東西[],然後mySecondArray到myFirstArray,也不會引用第一個變量,但兩個變量將引用相同的實際數組。

+1

如果你打算一直設置這兩個變量,那麼有兩個變量有什麼意義? – Barmar 2015-02-06 17:30:01

+0

的確如此,Greg Pete,你爲什麼需要兩個變量? – TRGWII 2015-02-06 17:32:38

+0

感謝TRGWII,但原因是我使用的是Angular,而父範圍擁有myFirstArray,而子範圍擁有mySecondArray - 如果可能的話,我想盡量減少這些數組的交叉控制器通信(即使它是通過服務或通過$看)。 mySecondArray必須與myFirstArray相同,但使用不同的名稱,因爲它是模板(由mySecondArray的控制器控制)正在使用的變量的名稱。 – 2015-02-06 17:33:49

0

發生什麼事情是,當您將父變量設置爲新值時,觀察者會丟失,並且更改不會應用於子項。

你需要做這個非常討厭的將文件放入數據映射中。

因此,而不是:

VAR myFirstArray

用途:

$ scope.data = {}; $ scope.data.myFirstArray = blah;

我強烈建議給數據對象一個更聰明的名字是可能的。

你可能會遇到的另一個問題是「點問題」,which is explained in this blog post.

+0

謝謝。當我使用Angular時,這更像是一個正常的Javascript問題。看到我對問題的編輯以證明問題。 – 2015-02-06 18:29:10