如何根据名称合并数组 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);
我正在尝试根据对象名称合并数组的值,如下所示
[
{
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);