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

问题描述 投票:0回答:5

嗨我正在使用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"}

如果你看到Im缺少key1及其value1。我理解它的设计,但我想知道是否有办法让我得到

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

如果我使用reduce不正确,请告诉我。谢谢!

javascript json reduce
5个回答
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);

0
投票

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

解决方案给你...

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

  return p;
}, {});

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

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

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]
  }),
  {}
)
© www.soinside.com 2019 - 2024. All rights reserved.