2015-03-13 60 views
-4

我有對象,並且對於每個元素,我可以生成一個隨機數。我使用這個簡單的代碼:Javascript多循環引用

var ss = []; 
var a = [{ i: 5, _r: 0 }, { i: 6, _r: 0 }, { i: 7, _r: 0 }]; 
var b = function (a) { for (var i = 0; i < a.length; i++) { a[i]._r = Math.random(); } return a; }; 
for (j = 0; j < 5; j++) { ss.push(b(a)); }; 
console.log(ss); 

日誌數組後,我獲得每個數組相同的對象。 RESP。 ss [0] [0] ._ r = ss [1] [0] ._ r = ss [2] [0] ._ r。但_r鍵是Math.random,這是不正確的。我希望每個關鍵字都有一個隨機數字。

而對於搜索解決方案,使用函數b是必要的!感謝

+1

你只是一遍又一遍地重寫相同的'a'屬性。克隆它在一路上的某個地方。 – Sirko 2015-03-13 20:01:00

+0

這個問題是[你以前的問題]的確切副本(http://stackoverflow.com/q/29032962/1048572)。請不要這樣做,[編輯]你的問題,而不是刪除並重新發布它。 – Bergi 2015-03-14 22:49:33

回答

1

的JavaScript按引用傳遞參數,所以每當你的數組傳遞給你的函數傳遞相同的實例,並把它添加到結果數組。因此他們都是一樣的。

一個簡單的解決方案是在b中創建一個新數組並返回它。

var ss = []; 
var a = [{ i: 5, _r: 0 }, { i: 6, _r: 0 }, { i: 7, _r: 0 }]; 
var b = function (x) { 
    var result = []; 
    for (var j = 0; j < x.length; j++) { 
     result.push({ i : x[j].i, _r : Math.random()}); 
    } 
    return result; 
}; 
for (j = 0; j < 5; j++) { ss.push(b(a)); }; 
console.log(ss); 

我不太確定其他屬性服務的目的,但你也可以傳遞一些輸入數組並用它來計算。重要的一點是創建一個新的數組。

+0

你有編輯過的考試嗎?現在我已經過了頭腦。謝謝 – user1173536 2015-03-13 20:03:39

+1

參數不是真的[通過引用傳遞](http://stackoverflow.com/a/3638034/2476755);它們按值傳遞(但可以修改對象的引用)。 – royhowie 2015-03-13 20:16:40

+0

對不起,這個解決方案的例子不起作用 – user1173536 2015-03-13 20:17:32