基于数组对象列表对Javascript对象进行分组

基于数组对象列表对Javascript对象进行分组,javascript,arrays,object,grouping,Javascript,Arrays,Object,Grouping,我试图找到一种基于组数组转换此对象列表的方法。我发现的棘手的部分是迭代组数组,如果有多个组,则将对象应用到多个位置 我还试图忽略任何不属于任何组织的团体。我尝试过使用reduce函数,但无法通过组数组获得迭代 let cars = [ { "group":[], "name": "All Makes", "code": ""

我试图找到一种基于组数组转换此对象列表的方法。我发现的棘手的部分是迭代组数组,如果有多个组,则将对象应用到多个位置

我还试图忽略任何不属于任何组织的团体。我尝试过使用reduce函数,但无法通过组数组获得迭代

  let cars = 
    [
      {
        "group":[],
        "name": "All Makes",
        "code": ""
      },
      {
        "group":["Group A"],
        "name": "BMW",
        "code": "X821"
      },
      {
        "group":["Group B"],
        "name": "Audi",
        "code": "B216"
      },
      {
        "group":["Group B"],
        "name": "Ford",
        "code": "P385"    
      },
      {
        "group":["Group B", "Group C"],
        "name": "Mercedes",
        "code": "H801"
      },
      {
        "group":["Group C"],
        "name": "Honda",
        "code": "C213"
      }
    ]
为此:

let cars = {
    "Group A": [
      {
        name: "BMW",
        code: "X821",
      }
    ],
    "Group B": [
      {
        name: "Audi", 
        code: "B216"
      },
      {
        name: "Ford", 
        code: "P385"
      },
      {
        name: "Mercedes",
        code: "H801"
      }
    ],
    "Group C":[
      {
        name: "Mercedes",
        code: "H801"
      },
      {
        name:"Honda", 
        code: "C213"
      }
    ]
  };
我已经尝试使用reduce来实现这一点,但是如果分组在多个组中,则不会复制分组

let result = cars.reduce(function(x, {group, name}){
  return Object.assign(x, {[group]:(x[group] || [] ).concat({group, name})})
}, {});
任何有助于这一点的指针都将不胜感激。

您可以使用。减少以循环方式遍历汽车中的每个汽车对象。对于给定汽车的每个组数组,然后可以使用.forEach将该组添加为累加器的键。如果已在累加器中设置组,则可以获取对象的分组数组,否则,可以创建新数组[]。一旦有了数组,就可以使用.concat将对象添加到数组中。由于我们在组数组上使用.forEach,因此如果对象为空,它不会将该对象添加到累积对象中,因为.forEach不会在空数组上迭代

见下例:

const cars=[{group:[],姓名:所有品牌,代码:},{group:[A组],姓名:宝马,代码:X821},{group:[B组],姓名:奥迪,代码:B216},{group:[B组],姓名:福特,代码:P385},{group:[B组,C组],姓名:本田,代码:C213}; const res=cars.reduceacc,{group,…r}=>{ group.forEachkey=>{ acc[key]=acc[key]| |[].concat{…r};//复制r,因此它是每个分组数组的不同引用 }; 返回acc; }, {}; console.logres 您可以使用.reduce在汽车中的每个汽车对象之间循环。对于给定汽车的每个组数组,然后可以使用.forEach将该组添加为累加器的键。如果已在累加器中设置组,则可以获取对象的分组数组,否则,可以创建新数组[]。一旦有了数组,就可以使用.concat将对象添加到数组中。由于我们在组数组上使用.forEach,因此如果对象为空,它不会将该对象添加到累积对象中,因为.forEach不会在空数组上迭代

见下例:

const cars=[{group:[],姓名:所有品牌,代码:},{group:[A组],姓名:宝马,代码:X821},{group:[B组],姓名:奥迪,代码:B216},{group:[B组],姓名:福特,代码:P385},{group:[B组,C组],姓名:本田,代码:C213}; const res=cars.reduceacc,{group,…r}=>{ group.forEachkey=>{ acc[key]=acc[key]| |[].concat{…r};//复制r,因此它是每个分组数组的不同引用 }; 返回acc; }, {};
console.logres 一些基本的方法@尼克的好多了

出租汽车=[{ 组:[], 名称:一切皆有可能, 代码: }, { 组:【A组】, 姓名:宝马, 代码:X821 }, { 组:[B组], 名称:奥迪, 代码:B216 }, { 组:[B组], 姓名:福特, 代码:P385 }, { 组:[B组,C组], 姓名:梅赛德斯, 代码:H801 }, { 组:【C组】, 名称:本田, 代码:C213 } ] 让新车={}; cars.forEacho=>{ o、 group.forEachg=>{ 如果!新车[g] 新车[g]=[]; 新车[g]。推{ 姓名:o.name, 代码:o.code }; }; };
控制台。lognewCars 一些基本的方法@尼克的好多了

出租汽车=[{ 组:[], 名称:一切皆有可能, 代码: }, { 组:【A组】, 姓名:宝马, 代码:X821 }, { 组:[B组], 名称:奥迪, 代码:B216 }, { 组:[B组], 姓名:福特, 代码:P385 }, { 组:[B组,C组], 姓名:梅赛德斯, 代码:H801 }, { 组:【C组】, 名称:本田, 代码:C213 } ] 让新车={}; cars.forEacho=>{ o、 group.forEachg=>{ 如果!新车[g] 新车[g]=[]; 新车[g]。推{ 姓名:o.name, 代码:o.code }; }; }; 控制台。lognewCars;