如何根据名称合并数组 javascript 中的重复对象值

How to merge duplicate object values in an array javascript based on a name

我正在尝试根据对象名称合并数组的值,如下所示

[
  {
    name: "truck",
    id: "2",
    data: [{ size: 1, colours: [{ name: 'red', id: 1 }] }]
  },
  {
    name: "Car",
    id: "6",
    data: [{ size: 2, colours: [{ name: 'blue', id: 2 }, { size: 4, colours: { name: 'green', id: 3 } }] }]
  },
  {
    name: "Car",
    id: "7",
    data: [{ size: 1, colour: [{ name: 'orange', id: 6 }, { size: 2, colours: { name: 'green', id: 3 } }] }]
  }
]

期望的结果是 none 重复条目保持不变,但是任何具有重复键的项目都按以下方式组合

[{name: "truck", id: "2", data: [{size: 1}, colours = [{name: "red", id:1}]]},
{name: "Car", variations:[
    {id: "6", data: [{size: 2, colours: [{name: "blue", id:2}, {size: 4, colours:{name:"green", id:3}}]}]},
    {id: "7", data: [{size: 1, colours: [{name: "orange", id:6}, {size: 2, colours:{name:"green", id:3}}]}]}
]}]
]

我一直在使用 reduce 和 for 循环,但我还没有找到任何有用的东西! (甚至关闭)

你应该在提问之前尝试一下,如果你的 javascript 确实有效(Sajeeb 在它无效之前编辑过它)也会更好。

下面的函数就可以实现你想要的效果。

const change = (vehiclesAsArray) => {
  const vehiclesNameToVariations = {};
  for (const vehicle of vehiclesAsArray) {
    if (!vehiclesNameToVariations[vehicle.name]) {
      vehiclesNameToVariations[vehicle.name] = {
        name: vehicle.name,
        variations: []
      };
    }

    vehiclesNameToVariations[vehicle.name].variations.push(vehicle);
  }

  const vehiclesAsArrayGrouped = [];
  for (const vehicle of Object.values(vehiclesNameToVariations)) {
    if (vehicle.variations.length === 1) {
      vehiclesAsArrayGrouped.push({
        name: vehicle.name,
        ...vehicle.variations[0]
      });
    } else {
      vehiclesAsArrayGrouped.push(vehicle);
    }
  }

  return vehiclesAsArrayGrouped;
};

First of all, it is not a valid object. I have corrected it. Try the below code

const oldArray = [
  {
    name: "truck",
    id: "2",
    data: [{ size: 1, colours: [{ name: 'red', id: 1 }] }]
  },
  {
    name: "Car",
    id: "6",
    data: [{ size: 2, colours: [{ name: 'blue', id: 2 }, { size: 4, colours: { name: 'green', id: 3 } }] }]
  },
  {
    name: "Car",
    id: "7",
    data: [{ size: 1, colour: [{ name: 'orange', id: 6 }, { size: 2, colours: { name: 'green', id: 3 } }] }]
  }
];

let newArray = [];

oldArray.forEach(item => {
  const index = newArray.findIndex(newItem => newItem.name === item.name);
  if (index >= 0) {
    const { ['name']: name, ...validObject } = item;
    if (newArray[index].variations) return newArray[index].variations.push(validObject)
    const { ['name']: oldName, ...oldValidObject } = newArray[index];
    const variations = [oldValidObject, validObject];
    newArray[index] = {
      name: item.name,
      variations: variations
    }
    return
  }
  newArray.push(item);
});

console.log(newArray);