首页 > 解决方案 > 使用高阶函数将嵌套数组转换为对象数组

问题描述

我目前有这个输入:

[
  [['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' }
];

我写了以下代码:

function transformEmployeeData(array) {
  let newArr = [];

  for(var i = 0; i< array.length; i++) {
    let newObj = {}
    for(var j = 0; j< array[i].length; j++) {
      newObj[array[i][j][0]] = array[i][j][1]
    }
    newArr.push(newObj);
  }

  return newArr; 
}

但是,我想尝试使用.map()and.reduce()函数。我该如何实施它们?

标签: javascriptfunctional-programminghigher-order-functions

解决方案


最简单的方法是可能使用.map()然后Object.fromEntries()用作您的映射函数,如下所示:

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

const res = arr.map(Object.fromEntries);
console.log(res);

但是,如果您真的想使用.reduce(),那么您可以使用.map()and.reduce()为您构建对象:

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

const res = arr.map(
  entries => entries.reduce((acc, [key, value]) => ({...acc, [key]: value}), {})
);
console.log(res);

以上用于.reduce()迭代[key, value]内部数组中的对数组。对于每个键值对,您可以对其进行解构( ([key, value]) =>) 以从数组中提取 thekey和 the 。value然后,您可以返回一个对象以用作accumulator 的下一个值。您返回的对象是acc(最初是{})和当前键值对的组合对象。这是使用带有计算属性名称( ) 的扩展语法( ) 完成的。...{[key]: value}


最后一种方法是将每个内部映射[key, value]到一个对象:

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

然后,您可以使用 将此数组映射到对象数组Object.assign(),其中每个参数Object.assign()都是内部数组中的对象。这将“合并”数组中的每个对象以形成一个更大的对象:

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

const res = arr.map(
  entries => entries.map(([k, v]) => ({[k]: v}))
).map(arr => Object.assign(...arr));
console.log(res);


推荐阅读