在javascript中将嵌套数组转换为Object

问题描述 投票:3回答:6

我正在进行一项涉及将数组转换为对象的任务,而且我有点紧张。我们从一个数组开始,包含两个额外的嵌套数组,每个数组包含可变数量的数组(每个数组包含两个值)。

赋值是将所有这些转换为一个包含多个对象的数组。在每个对象中,将存在一系列键/值对,其等于来自每个最小给定阵列的两个值。

EG

参数将如下所示:

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

给定输入,返回值应如下所示:

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

使用调试器,我已经确定我的代码正确地将键/值对分配给return语句中的第一个对象。但是,当循环继续时,不是创建新的嵌套对象,而是替换第一个对象的键/值对,因此我最终只得到一个对象,该对象具有来自所评估的最终数组的正确键值对。

到目前为止,这是我的代码:

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

这个让我的大脑有点结了......任何建议都会非常感激!!!

javascript arrays object nested
6个回答
2
投票

除了在第一个循环内移动新对象的赋值之外,您还可以考虑在函数顶部声明所有变量。

这就像是戏剧中所有演员的介绍。

function transformEmployeeData(employeeData) {
  var obj,
      arr = [],
      i, j,
      key, value;

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

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

console.log(transformEmployeeData(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

对于简短的解决方案,您可以使用一些ES5 / ES6功能:

  • qazxsw poi为每个元素返回一个新对象
  • qazxsw poi用于为对象分配更多属性,
  • Array#map以数组作为参数,
  • qazxsw poi,就像一个变压器和
  • qazxsw poi,Javascript的一些最伟大的想法。 (我希望它也适用于变量。)


0
投票

非常接近,你只需要将destructuring assignment放在外部for循环中

computed property names

演示

function transformEmployeeData(array) {
    return array.map(person => Object.assign(...person.map(([k, v]) => ({ [k]: v }))));
}

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

console.log(transformEmployeeData(array));

0
投票

如果你只是将qazxsw poi与qazxsw poi结合使用,这很简单。

.as-console-wrapper { max-height: 100% !important; top: 0; }

0
投票

您可以使用obj = {}迭代主数组中的function transformEmployeeData(employeeData) { var arr = [] for (var i = 0; i < employeeData.length; i ++) { var obj = {}; //observe this line for (var j = 0; j < employeeData[i].length; j ++) { var key = employeeData[i][j][0]; var value = employeeData[i][j][1]; obj[key] = value; } arr.push(obj); } return arr; } ,然后使用var arr = [ [ ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'] ], [ ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager'] ] ]; function transformEmployeeData(employeeData) { var arr = [] for (var i = 0; i < employeeData.length; i++) { var obj = {}; for (var j = 0; j < employeeData[i].length; j++) { var key = employeeData[i][j][0]; var value = employeeData[i][j][1]; obj[key] = value; } arr.push(obj); } return arr; } console.log( transformEmployeeData(arr) );将其子数组转换为对象属性。


0
投票

使用Array#reducelet data = [ [ ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk'] ], [ ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager'] ] ]; let result = data.map(item => { return item.reduce((acc, item) => { acc[item[0]] = item[1]; return acc; }, {}); }); console.log(result);与一些map

subarrays

演示片段:

reduce

0
投票

该问题的更新和一行解决方案:

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

var result = arr.map(function(subArr){
    return subArr.reduce(function(acc, data){
        acc[data[0]] = data[1];
        return acc;
    },{})
});

console.log(result);

Array.prototype.map()已在ECMAScript 2019(ES10)中引入

在撰写本文时(2019年4月11日),这种方法已经由Chrome 73和Firefox 63实现。很快它将由主要浏览器的新版本实现。自7.4.0版本(core-js @ 3)以来,BabelJs中也提供了该方法。

© www.soinside.com 2019 - 2024. All rights reserved.