嗨,我正在使用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。谢谢!
答案 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);