对象在加入循环内的数组时会覆盖

时间:2017-08-29 08:03:16

标签: javascript arrays object

我正在研究将数组转换为对象的算法。当最后一个转换的对象覆盖数组中的前一个对象时。

这是我的代码:

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时,我得到了预期的结果。当我将它添加到数组中时,它只会覆盖以前的结果。

2 个答案:

答案 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;
&#13;
&#13;

包含Object.assignspread syntax ...的简明版。

&#13;
&#13;
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;
&#13;
&#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;
}

希望有所帮助,同样在迭代时尽量避免操纵改变长度的交互式数组以避免意外结果,即“拼接,推送等”。