Javascript Reduce函数-将重复的键值连接为数组

时间:2018-07-09 19:03:34

标签: javascript json reduce

嗨,我正在使用reduce为以下数据创建更可用的JSON结构。

data = [
  { "0": "key1", "1": "value1" },
  { "0": "key2", "1": "value2" },
  { "0": "key3", "1": "value3" },
  { "0": "key1", "1": "value4" },
];

我为此使用了reduce,这是它的外观。

reduce_data = data.reduce((p, c) => {
  p[c["0"]] = c["1"];
  return p;
}, {});
console.log(reduce_data);

输出如下

{key1: "value4", key2: "value2", key3: "value3"}

如果看到我缺少key1及其value1。我是有意设计的,但是我想知道我是否有办法

{key1: "value1, value4", key2: "value2", key3: "value3"}

请让我知道我是否正确使用了reduce。谢谢!

5 个答案:

答案 0 :(得分:0)

理论上您做对了。问题在于第4个元素还具有key1,该元素会用value4覆盖该值。


更新

我读得太快了。一个解决方案可能是:

data.reduce(
  (result, { ['0']: key, ['1']: value }) => ({
    ...result, 
    [key]: [result[key], value].filter(Boolean).join(', ')
  }),
  {}
)

另一种方法(结果将值作为数组)

data.reduce(
  (result, { ['0']: key, ['1']: value }) => ({
    ...result, 
    [key]: [...(result[key] || []), value]
  }),
  {}
)

答案 1 :(得分:0)

检查密钥是否存在,然后追加而不是分配(覆盖值)。

为您提供解决方案...

data.reduce((p, c) => {
  if (p[c["0"]]) {
    p[c["0"]] += ", " + c["1"];
  } else {
    p[c["0"]] = c["1"];
  }

  return p;
}, {});

答案 2 :(得分:0)

对于您的特定情况,您可以这样操作:

data = [
  { "0": "key1", "1": "value1" },
  { "0": "key2", "1": "value2" },
  { "0": "key3", "1": "value3" },
  { "0": "key1", "1": "value4" },
];

reduce_data = data.reduce((p, c) => {
  p[c["0"]] = p[c["0"]] ? p[c["0"]] + ", " + c["1"] : c["1"];
  return p;
}, {});
console.log(reduce_data);

答案 3 :(得分:0)

您可以分配它,除非它已经存在,在这种情况下,请使用concat:

data = [
    { "0": "key1", "1": "value1" },
    { "0": "key2", "1": "value2" },
    { "0": "key3", "1": "value3" },
    { "0": "key1", "1": "value4" },
  ];

  reduce_data = data.reduce((p, c) => {
    p[c["0"]] = (p[c["0"]] || '').concat(", ", c["1"])
    return p;
  }, {});
  console.log(reduce_data);
  

您并没有真正询问,但是如果您推送到数组,则使用起来可能会更容易:

data = [
    { "0": "key1", "1": "value1" },
    { "0": "key2", "1": "value2" },
    { "0": "key3", "1": "value3" },
    { "0": "key1", "1": "value4" },
  ];

  reduce_data = data.reduce((p, c) => {
    (p[c["0"]] || (p[c["0"]] = [])).push(c["1"]);
    return p;
  }, {});
  console.log(reduce_data);
  

答案 4 :(得分:0)

使用ES6的destructirung分配可以使其更加整洁:

var data = [{ "0": "key1", "1": "value1" }, { "0": "key2", "1": "value2" }, { "0": "key3", "1": "value3" },{ "0": "key1", "1": "value4" },];

var result = data.reduce((p, {"0":key, "1": val}) => {

    if (!p.hasOwnProperty(key)) p[key] = [];
    p[key].push(val);
    return p;

}, {});

console.log(result);