【问题标题】:Converting array of javascript objects to key-value pairs of arrays based on property using ES6使用 ES6 将 javascript 对象数组转换为基于属性的数组键值对
【发布时间】:2019-03-31 02:49:01
【问题描述】:

假设我有以下对象数组:

myArray = [
  {name: 'First', parent: 1, delta: 2},
  {name: 'Second', parent: 1, delta: 1},
  {name: 'Third', parent: 2, delta: 1}
];

我想将此数组转换为一个对象,其中包含父项的键和对象的值。例如:

result = {
  1: [
       {name: 'First', parent: 1, delta: 2},
       {name: 'Second', parent: 1, delta: 1}
     ],
  2: [
       {name: 'Third', parent: 2, delta: 1}
     ]
}

我可以使用forEach 或嵌套循环来做到这一点,但我想知道是否有办法使用 ES6 语法来更简洁/内联,这将允许我在 @987654325 上进行排序等操作@等

【问题讨论】:

  • 这叫做“分组”。
  • 在决定使用哪种方法时,您可能会consider the performance 考虑不同的方法,并认为更少的代码本身很少是使用特定算法的好理由。普通的 if..else 方法比使用 spread 和 concat 的方法快近 10 倍,是 concat 方法的两倍。而且您可能还认为 if..else 对于没有经验的编码人员(他们最有可能执行此类任务)来说也更容易阅读和维护。

标签: javascript arrays typescript object


【解决方案1】:
const result = myArray.reduce((result, el) => {
  if (result[el.parent]) result[el.parent].push(el);
  else result[el.parent] = [el];
  return result;
}, {});

【讨论】:

  • 不要让get返回result,否则在第一次迭代后会出错(回调将undefined作为累加器传递)。 ;-)
【解决方案2】:

你可以使用reduce来实现这个

var myArray = [
  {name: 'First', parent: 1, delta: 2},
  {name: 'Second', parent: 1, delta: 1},
  {name: 'Third', parent: 2, delta: 1}
];

var result = myArray.reduce((o,d) =>
             (
               o[d.parent] = (o[d.parent] || []).concat(d)
               , o
             )
             , {})
console.log(result)

【讨论】:

    【解决方案3】:

    您可以为此使用Array.reduce()

    let myArray = [{
        name: 'First',
        parent: 1,
        delta: 2
      },
      {
        name: 'Second',
        parent: 1,
        delta: 1
      },
      {
        name: 'Third',
        parent: 2,
        delta: 1
      }
    ];
    var res = myArray.reduce((acc, item) => {
      if (acc[item.parent]) {
        acc[item.parent].push(item);
      } else {
        acc[item.parent] = [item];
      }
      return acc;
    }, {});
    console.log(res);

    【讨论】:

      【解决方案4】:

      var myArray = [
        {name: 'First', parent: 1, delta: 2},
        {name: 'Second', parent: 1, delta: 1},
        {name: 'Third', parent: 2, delta: 1}
      ];
      
      console.log(myArray.reduce((acc, val)=>({...acc, [val.parent]: (acc[val.parent] || []).concat(val)}), {}))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-01
        • 2013-01-14
        • 2014-10-02
        • 2018-01-06
        • 2018-09-11
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多