根据数组对象列表对 Javascript 个对象进行分组

Group Javascript object based on Array Object list

我正在尝试找到一种方法来根据组 array 转换此对象列表。我发现棘手的部分是遍历组数组并将对象应用于多个位置(如果有多个组)。

我也试图忽略任何不属于任何事物的群体。我试过使用 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})})
}, {});

如能提供帮助,我们将不胜感激。

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

参见下面的示例:

const 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" } ];
          
const res = cars.reduce((acc, {group, ...r}) => {
  group.forEach(key => {
    acc[key] = (acc[key] || []).concat({...r}); // copy r so it is a different reference for each grouped array
  });
  return acc;
}, {});
console.log(res);

一些基本方法。 @Nick 的好多了。

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 newCars = {};
cars.forEach(o => {
  o.group.forEach(g => {
    if (!newCars[g])
      newCars[g] = [];
    newCars[g].push({
      name: o.name,
      code: o.code
    });
  });
});
console.log(newCars);