修改对象数组,按键和值分组为对象的嵌套父/子数组

时间:2018-02-07 20:00:35

标签: javascript arrays

我正在尝试修改一个对象数组,以基于对键值进行分组来分解为嵌套的对象数组。

这是初始数据格式的一个示例:

[
    {key: "Toyota", color: "red", cost: 100 },
    {key: "Toyota", color: "green", cost: 200 },
    {key: "Chevrolet", color: "blue", cost: 300 },
    {key: "Honda", color: "yellow", cost: 400 },
    {key: "Datsun", color: "purple", cost: 500 }
]

这是我想要输出的输出:

[{
   key: "Toyota", 
   values:  [
    {color: "red", cost: 100 },
    {color: "green", cost: 200 }
  ]
 }, {
   key: "Chevrolet", 
   values:  [
    {color: "blue", cost: 300 }
  ]
 },{
   key: "Honda", 
   values:  [
    {color: "yellow", cost: 400 }
  ]
 },{
   key: "Datsun", 
   values:  [
    {color: "puruple", cost: 500 }
  ]
 }]

到目前为止,我已经在这些解决方案上取得了一些成功(主要是使用lodash中的_.map + _.groupBy解决方案),这有助于将数据拆分为父级 - >儿童格式。我目前仍然在根据值和键进行分组时遇到一些麻烦。 Group array of object nesting some of the keys with specific names

当前数据格式如下所示:

 [{
   key: "Toyota", 
   values:  [
    {color: "red", cost: 100 },
  ]
 },{
   key: "Toyota", 
   values:  [
    {color: "green", cost: 200 }
  ]
 }, {
   key: "Chevrolet", 
   values:  [
    {color: "blue", cost: 300 }
  ]
 },{
   key: "Honda", 
   values:  [
    {color: "yellow", cost: 400 }
  ]
 },{
   key: "Datsun", 
   values:  [
    {color: "puruple", cost: 500 }
  ]
 }]

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用Map而无需其他库。

(这是我对单个嵌套重新引用的引用问题的原始答案。问题有一个嵌套方法,有多个级别的深度,这里没有给出。)

var items = [{ key: "Toyota", color: "red", cost: 100 }, { key: "Toyota", color: "green", cost: 200 }, { key: "Chevrolet", color: "blue", cost: 300 }, { key: "Honda", color: "yellow", cost: 400 }, { key: "Datsun", color: "purple", cost: 500 }],
    map = new Map,
    result;

items.forEach(({ key, color, cost }) => {
    map.has(key) || map.set(key, { key, values: [] });
    map.get(key).values.push({ color, cost });
});

result = [...map.values()];

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