【问题标题】:transform nested array into array of objects using higher order function使用高阶函数将嵌套数组转换为对象数组
【发布时间】:2020-02-01 12:48:24
【问题描述】:

我目前有这个输入:

[
  [['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().reduce() 函数。我该如何实现它们?

【问题讨论】:

    标签: javascript functional-programming higher-order-functions


    【解决方案1】:

    最简单的方法可能是使用.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().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] 对数组。对于每个键值对,您可以通过destructure (([key, value]) =&gt;) 将其从数组中拉出keyvalue。然后,您可以返回一个对象以用作accumulator 的下一个值。您返回的对象是来自acc(最初是{})和当前键值对的组合对象。这是使用spread syntax (...) 和computed property names ({[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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2019-01-31
      相关资源
      最近更新 更多