2015-07-17 2 views
1

Я хочу изменить этотArray.push() и console.log() дает различные переменные

var array = [{"host": ["example.com", "www.example.com"], "from": "test1", "to": "test2"}, 
{"host": ["example.net", "www.example.net"], "from": "test3", "to": "test4"}]; 

в это на Chrome 43.0.2357.134 м

[{"host": "example.com", "from": "test1", "to": "test2"}, 
{"host": "www.example.com", "from": "test1", "to": "test2"}, 
{"host": "example.net", "from": "test3", "to": "test4"}, 
{"host": "www.example.net", "from": "test3", "to": "test4"}]; 

я использовал код

array.forEach(function(rule){ 
    rule.host.forEach(function(host){ 
     var tmp = rule; 
     tmp.host = host; 
     result.push(tmp); 
    }); 
}); 

но это дает

[{"host": "www.example.com", "from": "test1", "to": "test2"}, 
{"host": "www.example.com", "from": "test1", "to": "test2"}, 
{"host": "www.example.net", "from": "test3", "to": "test4"}, 
{"host": "www.example.net", "from": "test3", "to": "test4"}]; 

Когда я заменяю array.push на console.log(), он записывает правые переменные. Это не может быть проблемой async с array.push(), потому что я попробовал старый array.length способ добавить в массив - никаких изменений. Может быть, я использую foreach неправильно - есть много методов Array.prototype - я не могу получить правильный.

ответ

5

Массивы и объекты в Javascript передаются и присваиваются по ссылке, а не по значению. var tmp = rule просто делает второй указатель на исходное правило, затем вы переписываете данные и печатаете каждую запись дважды. Чтобы достичь желаемого эффекта, вы должны клонировать все данных в записи на новые записи.

array.forEach(function(rule){ 
    rule.host.forEach(function(host){ 
     result.push({ 
      host: host, 
      from: rule.from, 
      to: rule.to 
     }); 
    }); 
}); 
Смежные вопросы