我正在尝试基于 specs
对象数组构建一个新的对象数组。
已经有一些类似的问题,但没有帮助我。
const specs =
[
{ label: 'Brand', value: 'Nike' },
{ label: 'Age range', value: '8 to 13' },
{ label: 'Age range', value: '14+' }
]
我想跳过与我的代码一起使用的“品牌”,如果有多个对象具有相同的 label
,他们需要
合并到一个唯一的对象中,该对象包含该标签和 ALL
的值,因此输出将删除品牌并合并其他值:
[
{ label: 'Age range', value: '8 to 13 - 14+' }
]
这是我的代码:
var newSpecs = []
for (let x = 0; x < specs.length; x++) {
if (specs[x].label === 'Brand') continue
for (let j = x + 1; j < specs.length; j++) {
if (specs[x].label === specs[j].label) {
specs[x].value += ' - ' + specs[j].value
}
}
newSpecs.push({ label: specs[x].label, value: specs[x].value })
}
return newSpecs
但这根本行不通,它创建了多个合并的年龄范围。
我再次尝试使用 delete
和其他东西,但让我“无法读取未定义的标签”,所以我会保持这种方式,
但我不知道该怎么做
答案 0 :(得分:0)
您可以使用地图来分离标签
const specs = [
{ label: "Brand", value: "Nike" },
{ label: "Age range", value: "8 to 13" },
{ label: "Age range", value: "14+" },
];
const labelMap = {};
specs.forEach((sp) => {
if (sp.label !== "Brand") {
labelMap[sp.label] = labelMap[sp.label] || { label: sp.label, value: [] };
labelMap[sp.label].value.push(sp.value);
}
});
const op = Object.values(labelMap).map((el) => ({
...el,
value: el.value.join(" - "),
}));
console.log(op);
答案 1 :(得分:0)
您收到多个“年龄范围”,因为您有嵌套循环。尝试使用 .reduce()
进行分组的这种方法:
const specs = [
{ label: 'Brand', value: 'Nike' },
{ label: 'Age range', value: '8 to 13' },
{ label: 'Age range', value: '14+' }
];
var newSpecs = specs.reduce((res, curr) => {
if (curr.label === 'Brand') return res;
var group = res.find((el) => el.label === curr.label);
if (group) {
group.value += ' - ' + curr.value;
} else {
res.push(curr);
}
return res;
}, []);
console.log(newSpecs);