创建一个新的对象数组并合并具有相同值的对象

时间:2020-12-28 12:19:18

标签: javascript node.js arrays

我正在尝试基于 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 和其他东西,但让我“无法读取未定义的标签”,所以我会保持这种方式, 但我不知道该怎么做

2 个答案:

答案 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);