为什么我的javascript myarr.push(mydic)会覆盖my my中的数据?

时间:2017-08-25 07:42:49

标签: javascript arrays

目前正在编写一个采用3D数组并将值转换为键/值对数组的函数。以下是我的代码。

function arrToDictArray(array) {
  var myarr = [];
  var mydic = {};
  var x = 0;
  for (var i in array) {
    console.log("i: " + i);
    var x = array[i];
    for (var j in x) {
      console.log("j: " + j);
      mydic[array[i][j][0]] = array[i][j][1];
      console.log(mydic[array[i][j][0]]);
    }
    myarr.push(mydic);
    //console.log(myarr);
    //console.log(myarr[i]);
  }
  console.log(myarr);
  return myarr;
}

我期待我的新阵列显示

[{name:'Mauri', salary: 100000, age:40},{name: 'felicia', salary: 120000, age:36}] 

但我得到了felicia重复。

[{name: 'felicia', salary: 120000, age:36},{name: 'felicia', salary: 120000, age:36}] 

我试图在j循环和i和j循环之外完全改变我的myarr.push(mydic)方法,但它仍然被覆盖。我似乎无法理解为什么.push()会覆盖任何东西。

Screenshot我的输出。

2 个答案:

答案 0 :(得分:0)

您将同一个对象mydic)多次推送到数组上,并在每次循环迭代时覆盖该对象内部的内容。相反,您希望为每个循环迭代创建一个 new 对象。请参阅代码段中的两个***行:

function arrToDictArray(array) {

    var myarr = [];
    var mydic;                           // ***
    var x = 0;

    for (var i in array) {
        mydic = {};                      // ***
        //console.log("i: " + i);
        var x = array[i];
        for (var j in x) {
            //console.log("j: " + j);
            mydic[array[i][j][0]] = array[i][j][1];
            //console.log(mydic[array[i][j][0]]);
        }
        myarr.push(mydic);
    }
    console.log(myarr);

    return myarr;
}

arrToDictArray([
    [
        ["name", "Mauri"],
        ["salary", 100000],
        ["age", 40]
    ],
    [
        ["name", "felicia"],
        ["salary", 120000],
        ["age", 36]
    ]
]
);
.as-console-wrapper {
  max-height: 100% !important;
}

旁注:

  • for-in不适用于循环遍历数组条目,请参阅this answer以获取有关原因的详细解释以及您的各种选项。

答案 1 :(得分:-1)

在我为最新的angularJs项目编写的示例代码中我修改了它以便您可以在普通的javascript中使用它希望它能为您工作

var len = mydic.length;
for (var i = 0;i < len ; i++){
console.log(i + mydic[i]);
myarr.push({
 name: mydic[i].name,
 salary: mydic[i].salary,
 age: mydic[i].age
 })
}