【问题标题】:Get values of duplicated keys in array of object获取对象数组中重复键的值
【发布时间】:2018-10-03 13:20:27
【问题描述】:

我有一个这样的对象数组。我想摆脱重复的键(名称),并且只有一个名称与数组中的所有相关值。

let array = [ 
  { name: "dimensions", value: "dimensions value 1" },
  { name: "weight",     value: "weight value 1" },
  { name: "dimensions", value: "dimensions value 2" },
  { name: "weight",     value: "weight value 3" },
  { name: "dimensions", value: "dimensions value 3" },
  { name: "weight",     value: "weight value 3" } 
]

我想把它变成这样的东西:

result = [ {
  name : "dimensions", 
  values : ["dimention value 1", "dimention value 2", "dimention value 3"] 
    }, {
  name : "weights", 
  values : ["weight value 1", "weight value 2", "weight value 3"] 
} ]

注意:数组中对象的数量是可变的。 “重量”、“尺寸”、“颜色”、“品牌”等......

到目前为止我尝试过的:

let flags = [], output = [], l = array.length;

for (let i = 0; i < l; i++) {
    if (flags[array[i].name])
      continue;

    flags[array[i].name] = array[i].name;

    output.push({
        name : array[i].name,
        values : [array[i].value]
    });
}

它会返回如下内容:

[
  { name: "dimensions", values: [ "dimensions value 1"] },
  { name: "weight",     values: [ "weight value 1"] }
]
let array = [
  { name: "dimensions", value: "dimensions value 1" },
  { name: "weight",     value: "weight value 1"},
  { name: "dimensions", value: "dimensions value 2"},
  { name: "weight",     value: "weight value 3"},
  { name: "dimensions", value: "dimensions value 3"},
  { name: "weight",     value: "weight value 3" }
]

let flags = [], output = [], l = array.length;

for (let i = 0; i < l; i++) {
  if (flags[array[i].name])
    continue;

  flags[array[i].name] = array[i].name;

  output.push({
    name: array[i].name,
    values: [array[i].value]
  });
}

console.log(output);

【问题讨论】:

    标签: javascript arrays algorithm loops sorting


    【解决方案1】:

    虽然其他答案已经产生了您想要的输出,但您可能会发现使用键是“维度”和“权重”且它们的值是字符串数组的对象更容易。你可以用更简单的reduce:

    const out = array.reduce((p, c) => {
      p[c.name] = p[c.name] || [];
      p[c.name].push(c.value);
      return p;
    }, {});
    

    输出

    {
      "dimensions": [
        "dimensions value 1",
        "dimensions value 2",
        "dimensions value 3"
      ],
      "weight": [
        "weight value 1",
        "weight value 3",
        "weight value 3"
      ]
    }
    

    这只是意味着您现在可以访问属性:

    out.dimensions[0]
    

    而不是

    out[0].values
    

    这在 imo 中不太有用。

    【讨论】:

      【解决方案2】:

      您可以使用 ES6 Map 来存储值,然后使用扩展语法 ... 来获取对象数组中的值。

      let array = [ {name: "dimensions", value: "dimensions value 1"},{name: "weight", value: "weight value 1"},{name: "dimensions", value: "dimensions value 2"},{name: "weight", value: "weight value 3"},{name: "dimensions", value: "dimensions value 3"},{name: "weight", value: "weight value 3"} ]
      
      const map = array.reduce((r, {name, value}) => {
        if(!r.has(name)) r.set(name, {name, values: [value]});
        else r.get(name).values.push(value)
        return r;
      }, new Map);
      
      const result = [...map.values()];
      console.log(result)

      【讨论】:

        【解决方案3】:

        您可以使用array#reduce 和Object.values() 根据name 对数组进行分组。

        let array = [ {name: "dimensions", value: "dimensions value 1"}, {name: "weight", value: "weight value 1"}, {name: "dimensions", value: "dimensions value 2"}, {name: "weight", value: "weight value 3"}, {name: "dimensions", value: "dimensions value 3"},{name: "weight", value: "weight value 3"} ],
          result = Object.values(array.reduce((r,{name, value}) => {
            r[name] = r[name] || {name, values : []};
            r[name].values.push(value);
            return r;
          },{}));
        console.log(result);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-11
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          • 1970-01-01
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多