我正在尝试构建一个对象数组,但要组合相似的属性并将它们的值加在一起。如此多的x
数组应该变成对象的y
数组。它必须是对象数组,而不仅仅是数组
var x = [
{"2018-09-13": "100"},
{"2018-09-14": "50"},
{"2018-09-14": "50"},
{"2018-09-15": "100"}
];
所需结果
var y = [
{"2018-09-13": "100"},
{"2018-09-14": "50,50"},
{"2018-09-15": "100"}
];
这是我正在运行的将它们添加在一起的功能,但是不起作用。我相信这与导致hasOwnProperty
方法出现问题的数组索引有关
var z = [];
x.forEach((item) => {
for(var date in item) {
if(z.hasOwnProperty(date)) {
z[date] += "," + item[date];
} else {
z.push({[date]: item[date]});
}
}
})
console.log(z)
答案 0 :(得分:1)
您的z
是一个数组,因此,如果您像数组一样使用它,它将永远不会通过hasOwnProperty
测试,因为数组具有数字索引,而不是日期字符串索引。代替使用数组,尝试reduce
进入对象(您可以从中使用标准属性查找),然后最后获取该对象的值以将其转换回数组。您可以使用Object.entries
一次获取键和值-由于对象只有一对键值对,因此无需使用for..in
循环。
const x = [
{"2018-09-13": "100"},
{"2018-09-14": "50"},
{"2018-09-14": "50"},
{"2018-09-15": "100"}
];
const y = Object.values(x.reduce((a, obj) => {
const [[key, val]] = Object.entries(obj);
if (!a[key]) a[key] = { [key] : val };
else a[key][key] += ',' + val;
return a;
}, {}));
console.log(y);
答案 1 :(得分:1)
您可以通过减少数组来对数组进行分组,然后仅在未找到键的情况下才将值推入累加器,如果找到键,只需更新值即可...
var array = [{
"2018-09-13": "100"
},
{
"2018-09-14": "50"
},
{
"2018-09-14": "50"
},
{
"2018-09-15": "100"
}
];
var grouped = array.reduce((acc, obj) => {
var old = null;
let key = Object.keys(obj)[0]
old = acc.find(item => key == Object.keys(item)[0]);
if (!old) {
acc.push(obj);
} else {
old[key] += `, ${obj[key]}`;
}
return acc;
}, []);
console.log(grouped);