嗨我正在使用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不正确,请告诉我。谢谢!
对于您的具体情况,您可以这样做:
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);
检查密钥是否存在,然后附加而不是分配(覆盖该值)。
解决方案给你...
data.reduce((p, c) => {
if (p[c["0"]]) {
p[c["0"]] += ", " + c["1"];
} else {
p[c["0"]] = c["1"];
}
return p;
}, {});
您可以分配它,除非它已经存在,在这种情况下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);
使用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);
从理论上讲,你做得对。问题是第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]
}),
{}
)