将多维数组转换为对象数组。嵌套循环与回调

Transforming multidimensional array into array of objects. Nested loops vs callbacks

我目前正在研究一个非常流行的 JS 对象问题:transformEmployeeData。我得到了映射参数数组及其内部数组的解决方案。我对此很满意。但是,我第一次尝试解决同样的问题是创建两个循环,嵌套它们并创建我的对象。由于某种原因,这个解决方案没有给我预期的结果,我想知道为什么会这样?正如我所说,我的兴趣是学习好 JS 的工作原理。不仅让我的规格达到 运行。谢谢。

这里是已经可以工作的代码:

    function transformEmployeeData(array) {   
  return array.map(function(outterArr){
        const finalObj = {};
        outterArr.map(function(innerArr){
           finalObj[innerArr[0]] = innerArr[1];
         });
         return finalObj;   }); }

其 returning 值(预期值):

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

我的第一次尝试(我不明白为什么它不return上述值):

    function transformEmployeeData(array) {  
     let finalArr = [];   
const finalObj = {};  
    for(let i = 0; i < array.length; i +=1){
        let outterArr = array[i];
      for (let j = 0; j < outterArr.length; j+=1){
          let innerArr = outterArr[j];
          finalObj[innerArr[0]] = innerArr[1];    
    }   
     finalArr.push(finalObj);   
    }  
     return finalArr; 
    }

它的 return 值(对我来说很奇怪……):

[ { firstName: 'Mary',
    lastName: 'Jenkins',
    age: 36,
    role: 'manager' },
  { firstName: 'Mary',
    lastName: 'Jenkins',
    age: 36,
    role: 'manager' } ]

原始数据:

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

你定义了一次finalObj,但是你多次更新和推送它。由于同一个对象被推入数组,所有项目都显示在上一个循环中分配的值。在每次迭代中创建一个新的 finalObj:

function transformEmployeeData(array) {
  const finalArr = [];

  for (let i = 0; i < array.length; i += 1) {
    const finalObj = {};
    const outterArr = array[i];
    
    for (let j = 0; j < outterArr.length; j += 1) {
      const innerArr = outterArr[j];
      finalObj[innerArr[0]] = innerArr[1];
    }
    
    finalArr.push(finalObj);
  }
  return finalArr;
}

const employeeData = [[["firstName","Joe"],["lastName","Blow"],["age",42],["role","clerk"]],[["firstName","Mary"],["lastName","Jenkins"],["age",36],["role","manager"]]];

console.log(transformEmployeeData(employeeData));

您也可以使用 for...of 代替标准的 for 循环:

function transformEmployeeData(array) {
  const finalArr = [];

  for (const outterArr of array) {
    const finalObj = {};
    
    for (const innerArr of outterArr) {
      finalObj[innerArr[0]] = innerArr[1];
    }
    
    finalArr.push(finalObj);
  }
  return finalArr;
}

const employeeData = [[["firstName","Joe"],["lastName","Blow"],["age",42],["role","clerk"]],[["firstName","Mary"],["lastName","Jenkins"],["age",36],["role","manager"]]];

console.log(transformEmployeeData(employeeData));