2014-09-30 2 views
0

Я пытаюсь использовать цикл for..in для перебора списка имен, добавления их в объект шаблона ('group'), а затем добавить каждый полный объект в массив ('queryList'). Это не работает, потому что каждая итерация перезаписывает ВСЕ значения в массиве. Любые предложения, почему это происходит?For..In Loop Overwriting ALL Array Values ​​

// 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] = группы;'. Посмотрите на это 'i'. Можете ли вы установить 'queryList [" LOGIN "]' на значение? Или, может быть, queryList должен быть инициализирован как словарь? Я могу просто избегать использования 'in', пока я не пойму, что я делаю с этими переменными. – Bobort

+1

Проблема вовсе не с оператором 'in', проблема в том, что' group' является ссылкой и не копируется. –

ответ

1

Вы создаете массив элементов, относящихся к одному и тому же объекту, поэтому все они отображают одно и то же имя, совпадающее с последним изменением, которое является «ПОИСК» в вашем примере.
Вы должны передать каждый элемент новому объекту, созданному из того, который вы хотите использовать в качестве шаблона.
Для этого можно либо цикл по своим свойствам или клонировать его, как показано ниже:

// 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

Я принимаю ваш ответ. Это понятно, кратким и имеет полный примерный код. Я должен был больше помнить, что объекты передаются как ссылки не значения. Спасибо, Лука! –

+1

@SC_Chupacabra: Спасибо! –

2

Вы модифицировать group объект каждый раз, но вы должны изменить его копию.

Добавьте этот код сразу после вашей линии for (var i in groupList){

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

На каждой итерации создается новый объект и скопировать на него все свойства от главного объекта.

+0

А, я вижу. Это должно было быть очевидно, ха-ха. Я передаю объект по ссылке, а не по значению. Спасибо чувак! –