2014-09-30 23 views
0

我試圖使用for..in循環遍歷名稱列表,將它們添加到模板對象('組'),然後將每個完整的對象添加到一個數組('queryList')。這不起作用,因爲每次迭代都會覆蓋數組中的所有值。任何建議爲什麼會發生這種情況For..In循環覆蓋所有數組值

// BATTERY OBJECT 
var groupList = [ "LOGIN", "BROWSE", "SEARCH"]; 

// GROUP OBJECT 
var group = {dbName: 'CARS', name: '', collectionName: 'group'}; 

// INIT VARS 
var groupName = '', 
    queryList = []; 

// COMPILATION FUNCTION 
var buildGroupQueries = function(group){ 

    // BUILD BATCH OF QUERIES 
    for (var i in groupList){ 
     groupName = groupList[i]; 
     group.name = groupName; 
     queryList[i] = group; 
    } 
    console.log(queryList); 

} 

buildGroupQueries(group); 

它應該看起來像:

[ 
    {"dbName":"CARS","name":"LOGIN","collectionName":"group"}, 
    {"dbName":"CARS","name":"BROWSE","collectionName":"group"}, 
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"} 
] 

相反,我得到:

[ 
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"}, 
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"}, 
    {"dbName":"CARS","name":"SEARCH","collectionName":"group"} 
] 
+0

問題是與'queryList [I] =基團;'。看看那個'我'。你可以設置queryQuery [「LOGIN」]爲一個值嗎?或者,也許queryList需要被初始化爲一個字典?我可能會避免使用'in',直到我更好地理解我對這些變量所做的事情。 – Bobort 2014-09-30 23:12:22

+1

問題根本不在於'in'語句中,問題在於'group'是一個引用並且不會被複制。 – 2014-09-30 23:13:38

回答

1

您正在創建一個引用同一對象的元素數組,因此它們都顯示與上次更改時相同的名稱,在您的示例中爲「SEARCH」。
您必須將每個元素引用從您想用作模板的對象創建的新對象。
這樣做可以在它的屬性或者循環或克隆,如下所示:

// BATTERY OBJECT 
var groupList = [ "LOGIN", "BROWSE", "SEARCH"]; 

// GROUP OBJECT 
var group = {dbName: 'CARS', name: '', collectionName: 'group'}; 

// INIT VARS 
var groupName = '', 
    queryList = []; 

// COMPILATION FUNCTION 
var buildGroupQueries = function(group){ 
    var i, _group; 

    // BUILD BATCH OF QUERIES 
    for (i in groupList){ 
     _group  = JSON.parse(JSON.stringify(group)); 
     groupName  = groupList[i]; 
     _group.name = groupName; 
     queryList[i] = _group; 
    } 
    console.log(queryList); 

} 

buildGroupQueries(group); 
+0

我接受你的回答。它很清晰,簡潔,並有完整的示例代碼。我應該更加註意對象是作爲參考而不是值傳遞的。謝謝盧卡! – 2014-10-01 18:27:45

+1

@SC_Chupacabra:謝謝! – 2014-10-01 20:55:10

2

您修改group對象每次,但是你需要修改它的副本。

從主對象添加只要將此代碼行for (var i in groupList){

var _group = {}; 
for (var j in group){ _group[j] = group[j]; } 

在每次迭代之後創建一個新的對象,並複製到它的所有屬性。

+0

啊,我明白了。這應該是顯而易見的哈哈。我通過引用傳遞對象,而不是值。謝啦! – 2014-09-30 23:19:31