目前正在编写一个采用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我的输出。
答案 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
})
}