在嵌套循环中移动变量 JavaScript

Moving variables in nested Loop JavaScript

function transformEmployeeData(employeeData) {
  var arr = [];
  var obj = {};
  for (var i = 0; i < employeeData.length; i++) {

    var personArr = employeeData[i];
    for (var j = 0; j < personArr.length; j++) {
      var key = personArr[j][0];
      var value = personArr[j][1];
      obj[key] = value;
    }
    arr.push(obj);
  }
  return arr;
}

input = [
  [
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
  ],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];

var getData = transformEmployeeData(input);
console.log(getData);

我希望我的结果是这样的:

[
    {firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'},
    {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
]

所以我将 var obj = {}; 移动到第一个 for 循环中,我得到了正确的结果。但我仍然不明白为什么我必须将它移动到循环内?有什么不同?请帮忙,谢谢!

如果你不把它放在循环中,你就是在定义一个对象,只是在循环体内修改它的内容,然后把这个对象推入数组。

但是,如果将它包含在循环中,则每次循环体执行时都会创建一个新对象(现有变量不再指向前一个对象,现在引用新对象),然后推送该新对象进入数组,导致输出中有多个对象。

如果您不在第一个循环中添加该对象,您将为整个函数执行创建一个对象,该对象可以由第二个循环覆盖第一个循环的先前属性

你可以使用 mapObject.fromEntries

function transformEmployeeData(employeeData) {
 return employeeData.map(Object.fromEntries)
}

input = [
  [
    ['firstName', 'Joe'],
    ['lastName', 'Blow'],
    ['age', 42],
    ['role', 'clerk']
  ],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];

var getData = transformEmployeeData(input);
console.log(getData);