循环嵌套数组并转换为对象

kno*_*eur 2 javascript arrays loops nested-loops multidimensional-array

我想将一组嵌套数组转换为一个对象数组,其中包含来自嵌套数组的收集信息:

之前:

var employeeData = [
  [
    ['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
  ],
  [
    ['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
  ]
]
Run Code Online (Sandbox Code Playgroud)

后:

[
  {firstName: 'Bob', lastName: 'Lob', age: 22, role: 'salesperson'},
  {firstName: 'Mary', lastName: 'Joe', age: 32, role: 'director'}
]
Run Code Online (Sandbox Code Playgroud)

这是我写的解决这个问题的函数,但是我无法看到循环出错的地方:

    var employeeData = [
      [
        ['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
      ],
      [
        ['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
      ]
    ]


    function transformData(employeeData) {
      let newObject = {};
      let newArr = [];
  
      for (var i = 0; i < employeeData.length; i++) { 
        for (var x = 0; x < employeeData[i].length; x++) { 
          for (var y = 0; y < employeeData[i][y].length; y++) { 
            newObject[employeeData[i][y][0]] = employeeData[i][y][1];
          } 
        }
        newArr.push(newObject);
        newObject = {};
      }
      return newArr;
    }
    
    console.log(transformData(employeeData));
Run Code Online (Sandbox Code Playgroud)

提前致谢.

ibr*_*rir 9

您的代码有什么问题:

第三级for循环搞砸了.它应该删除:

for (var y = 0; y < employeeData[i][x].length; y++) {
//                                  ^ by the way this should be x not y (not fixing the problem though)
Run Code Online (Sandbox Code Playgroud)

因为第三级数组包含您需要同时使用的2个元素(作为键值),所以for应该删除它们的循环.

固定:

for (var i = 0; i < employeeData.length; i++) { 
    for (var x = 0; x < employeeData[i].length; x++) { 
        newObject[employeeData[i][x][0]] = employeeData[i][x][1];
    }
    newArr.push(newObject);
    newObject = {};
}
Run Code Online (Sandbox Code Playgroud)

修复代码示例:

var employeeData = [
  [
    ['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
  ],
  [
    ['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
  ]
]


function transformData(employeeData) {
  let newObject = {};
  let newArr = [];

  for (var i = 0; i < employeeData.length; i++) { 
    for (var x = 0; x < employeeData[i].length; x++) { 
        newObject[employeeData[i][x][0]] = employeeData[i][x][1];
    }
    newArr.push(newObject);
    newObject = {};
  }
  return newArr;
}

console.log(transformData(employeeData));
Run Code Online (Sandbox Code Playgroud)

替代方案:

您可以将map employeeData数组放入一个新数组中,将reduce每个子数组放入一个对象中,如下所示:

var result = employeeData.map(function(sub) {
    return sub.reduce(function(obj, pair) {
        obj[ pair[0] ] = pair[1];
        return obj;
    }, {});
});
Run Code Online (Sandbox Code Playgroud)

使用ES6的箭头功能可以缩短以下内容:

let result = employeeData.map(sub => sub.reduce((obj, pair) => (obj[pair[0]] = pair[1], obj), {}));
Run Code Online (Sandbox Code Playgroud)

例:

let employeeData = [
  [
    ['firstName', 'Bob'], ['lastName', 'Lob'], ['age', 22], ['role', 'salesperson']
  ],
  [
    ['firstName', 'Mary'], ['lastName', 'Joe'], ['age', 32], ['role', 'director']
  ]
];

let result = employeeData.map(sub => sub.reduce((obj, pair) => (obj[pair[0]] = pair[1], obj), {}));

console.log(result);
Run Code Online (Sandbox Code Playgroud)

  • 逗号运算符的@CarlEdwards MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator。 (2认同)
  • 谢谢。从来不知道你可以做这样的事情。 (2认同)
  • @ibrahimmahrir谢谢!为了阐明我的推理中的错误,我认为我将两个要素(例如,第一要素和鲍勃)中的每一个视为“循环通过”的东西,这意味着需要单独进行研究。只需第二个for循环,因为我想在一次迭代中将这两个键值对作为一组工作,而不是每个元素(“第一个”然后是“ Bob”)都有自己的迭代。 (2认同)
  • @ knox-flaneur通常但并非必需,所有嵌套数组都需要一个“ map / reduce”。这实际上取决于您要如何处理数据。想象这样一个嵌套数组:`[[“ nox”,“ flaneur”],[“ ibrahim”,“ mahrir”]]`,而您想更改为`[“ knox flaneur”,“ ibrahim mahrir”]`,那么只有`map`与`join`一起使用:`àrr.map(sub =&gt; sub.join(“”));`。如果数组是[[[5,6,7],[1,4,2]]`,并且您想将其转换为[[18,7]],则map / reduce很有用:arr。 map(sub =&gt; sub.reduce((sum,n)=&gt; sum + n,0));`。看到?这实际上取决于您要如何处理数据 (2认同)

Ori*_*ori 5

如何修复您的代码

您只需要2个for循环:1.迭代数组2.迭代子数组并构造对象

var employeeData = [[["firstName","Bob"],["lastName","Lob"],["age",22],["role","salesperson"]],[["firstName","Mary"],["lastName","Joe"],["age",32],["role","director"]]]

function transformData(employeeData) {
  let newObject;
  const newArr = [];

  for (var i = 0; i < employeeData.length; i++) {
    newObject = {}; // init new object
    for (var x = 0; x < employeeData[i].length; x++) {
        newObject[employeeData[i][x][0]] = employeeData[i][x][1]; // iterate inner arrays and assign properties to object
    }
    newArr.push(newObject);
  }
  return newArr;
}

console.log(transformData(employeeData));
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用Array#map组合来迭代外部数组,并使用Array#reduce从内部数组构造对象:

const employeeData = [[["firstName","Bob"],["lastName","Lob"],["age",22],["role","salesperson"]],[["firstName","Mary"],["lastName","Joe"],["age",32],["role","director"]]]

const result = employeeData.map((arr) => 
  arr.reduce((o, [key, value]) => (o[key] = value, o), {})
);

console.log(result);
Run Code Online (Sandbox Code Playgroud)