我正在研究将数组转换为对象的算法。当最后一个转换的对象覆盖数组中的前一个对象时。
这是我的代码:
let array = [
[
['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
],
[
['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
]
];
function transformEmployeeData(array) {
let obj = {};
for(let i in array) {
for(let j in array[i]) {
obj[array[i][j][0]] = array[i][j][1];
}
array.splice(i,1,obj);
}
return array;
}
let run = transformEmployeeData(array);
我希望得到这个结果作为输出:
[
{firstName: "Joe", lastName: "Blow", age: 42, role: "clerk"}
{firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"}
];
而不是得到这个
[
{firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"},
{firstName: "Mary", lastName: "Jenkins", age: 36, role: "manager"}
];
当我记录obj时,我得到了预期的结果。当我将它添加到数组中时,它只会覆盖以前的结果。
答案 0 :(得分:1)
基本上你反复使用同一个对象并取最后一个值,因为它保留了引用。
您可以使用空对象为每个循环初始化obj
。
对于结果,您可以使用新数组,而不会改变原始数组。
只是另一个提示,对于迭代数组,您可以更好地使用索引并对其进行计数,而不是for ... in
语法:Why is using “for…in” with array iteration a bad idea?。
var array = [
[
['firstName', 'Joe'],
['lastName', 'Blow'],
['age', 42],
['role', 'clerk']
],
[
['firstName', 'Mary'],
['lastName', 'Jenkins'],
['age', 36],
['role', 'manager']
]
];
function transformEmployeeData(array) {
var i, j, temp = [];
for (i = 0; i < array.length; i++) {
let obj = {};
for (j = 0; j < array[i].length; j++) {
obj[array[i][j][0]] = array[i][j][1];
}
temp.push(obj);
}
return temp;
}
let run = transformEmployeeData(array);
console.log(run);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
包含Object.assign
和spread syntax ...
的简明版。
const getKeyValueArray = array =>
array.map(a => Object.assign(...a.map(([k, v]) => ({ [k]: v }))));
var data = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']], [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]];
console.log(getKeyValueArray(data));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:1)
为什么不将splice
替换为push
新数组并返回新数组呢?
function transformEmployeeData(array) {
let returnvalue = [];
for(let i in array) {
let obj = {};
for(let j in array[i]) {
obj[array[i][j][0]]=array[i][j][1];
}
returnvalue.push(obj);
}
return returnvalue;
}
希望有所帮助,同样在迭代时尽量避免操纵改变长度的交互式数组以避免意外结果,即“拼接,推送等”。