0

我试图基于对象数组构建一个新的对象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和其他东西,但让我“无法读取未定义的标签”,所以我会保持这种方式,但我不知道该怎么做

4

2 回答 2

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

于 2020-12-28T12:29:25.620 回答
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);

于 2020-12-28T12:30:50.140 回答