当前位置: 代码迷 >> JavaScript >> Array.push()和console.log()提供不同的变量
  详细解决方案

Array.push()和console.log()提供不同的变量

热度:49   发布时间:2023-06-13 11:46:54.0

我想修改这个

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"}];

当我用console.log()替换array.push ,它会记录正确的变量。 array.push()可能不是异步问题,因为我尝试了将旧的array.length方法添加到array的方法-无需更改。 可能是我错误地使用了foreach - Array.prototype方法很多-我找不到正确的方法。

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

array.forEach(function(rule){
    rule.host.forEach(function(host){
        result.push({
            host: host,
            from: rule.from,
            to: rule.to
        });
    });
});
  相关解决方案