我有一个对象数组。
[
{ _id: { year: 2020, month: 1 } },
{ _id: { year: 2019, month: 1 } },
{ _id: { year: 2019, month: 2 } },
{ _id: { year: 2019, month: 4 } },
{ _id: { year: 2019, month: 5 } },
{ _id: { year: 2019, month: 8 } },
{ _id: { year: 2019, month: 9 } },
{ _id: { year: 2019, month: 11 } }
]
我想从对象中删除重复的年份属性,并将不同的月份数据推送到一个数组对象中。
我想获得以下输出:
[
{
"_id": {
"year": 2020,
"month": [1]
}
},
{
"_id": {
"year": 2019,
"month": [1, 2, 4, 5, 8, 9, 11]
}
}
]
我已经尝试过,但无法获得预期的输出:
let arr = [
{ _id: { year: 2020, month: 1 } },
{ _id: { year: 2019, month: 1 } },
{ _id: { year: 2019, month: 2 } },
{ _id: { year: 2019, month: 4 } },
{ _id: { year: 2019, month: 5 } },
{ _id: { year: 2019, month: 8 } },
{ _id: { year: 2019, month: 9 } },
{ _id: { year: 2019, month: 11 } }
];
let newArr= [];
arr.forEach(function (item) {
let isMatch = newArr.filter(function (elem) {
return elem._id.year === item._id.year
})
if (isMatch.length == 0) {
newArr.push(item)
}
else {
newArr.find(x => x._id.year === item._id.year)._id.month.push(...item._id.month);
}
})
console.log(newArr);
答案 0 :(得分:1)
答案 1 :(得分:0)
首先使对象按年份索引,其值是到目前为止该年找到的月份,并在每次迭代时推入该年份的数组(如有必要,创建)。然后,将数组的对象转换为您的输出结构:
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
答案 2 :(得分:0)
您可以使用reduce和findIndex并检查累加器数组是否包含该年份,然后只需按下月份即可。
let data = [{
_id: {
year: 2020,
month: 1
}
},
{
_id: {
year: 2019,
month: 1
}
},
{
_id: {
year: 2019,
month: 2
}
},
{
_id: {
year: 2019,
month: 4
}
},
{
_id: {
year: 2019,
month: 5
}
},
{
_id: {
year: 2019,
month: 8
}
},
{
_id: {
year: 2019,
month: 9
}
},
{
_id: {
year: 2019,
month: 11
}
}
]
let newData = data.reduce((acc, curr) => {
let isYrPresent = acc.findIndex((item) => {
return item._id.year === curr._id.year;
});
if (isYrPresent === -1) {
acc.push({
_id: {
year: curr._id.year,
month: [curr._id.month]
}
})
} else {
acc[isYrPresent]._id.month.push(curr._id.month)
}
return acc;
}, []);
console.log(newData)