Array.push()和console.log()给出了不同的变量

时间:2015-07-17 23:07:01

标签: javascript arrays

我想修改此

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 m

上进入此页面
[{"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()时,它会记录正确的变量。它不能是array.push()的异步问题,因为我尝试使用旧array.length方式添加到数组 - 没有更改。可能是我使用foreach错误 - 有很多Array.prototype方法 - 我无法正确使用。

1 个答案:

答案 0 :(得分:5)

Javascript中的数组和对象通过引用传递和分配,而不是通过值传递。 var tmp = rule只是指向原始规则的第二个指针,然后您将覆盖数据并打印每个条目两次。要达到预期效果,必须将条目中所有的数据克隆到新条目中。

array.forEach(function(rule){
    rule.host.forEach(function(host){
        result.push({
            host: host,
            from: rule.from,
            to: rule.to
        });
    });
});