[英]Group objects by multiple properties and merge array property
在示例中,我使用每个到 go 到 select 字段并创建一个数据数组,我需要将 2 个属性year
和cabin
分组,属性months
也是一个我想合并的数组,事情是我有点获得想要的结果的麻烦:
JSFIDDLE: http://jsfiddle.net/tc39xu6b/2/
结果我得到:
[
{
"year": "2021",
"cabin": "1",
"months": [
"1",
"2"
]
},
{
"year": "2021",
"cabin": "1",
"months": [
"4"
]
},
{
"year": "2021",
"cabin": "2",
"months": [
"1",
"2"
]
},
{
"year": "2022",
"cabin": "1",
"months": [
"1",
"2"
]
},
{
"year": "2022",
"cabin": "1",
"months": [
"4"
]
},
{
"year": "2022",
"cabin": "2",
"months": [
"1",
"2"
]
}
]
这是我需要的结果:
{
"2021": [
{"cabin":1, "months": ["1", "2","4"]},
{"cabin":2, "months": ["1", "2"]}
],
"2022": [
{"cabin":1, "months": ["1", "2","4"]},
{"cabin":2, "months": ["1", "2"]}
]
}
所以,你已经完成了解决方案。
根据你所拥有的,我写了一个分组 function:
const addUnique=(arr1,arr2)=>{ arr2.forEach(item=>arr1.includes(item) || arr1.push(item)) return arr1; } const grouped= obj.reduce((groups,item)=>{ const yearItems=(groups[item.year]||[]) const cabinItem=yearItems.find(({cabin})=>cabin===item.cabin) const newCabinItem=cabinItem||{cabin:item.cabin}; newCabinItem.months=addUnique(newCabinItem.months||[],item.months); return {...groups, [item.year]: cabinItem? yearItems.map(yearItem => yearItem.cabin === item.cabin? newCabinItem: yearItem): yearItems.concat([newCabinItem]) } },{})
你可以看到它在这里工作: http://jsfiddle.net/9huwkz5L/
这是一个相当标准group by
情况分组。 下面的代码片段使用reduce()
重构您的数组,但您可以将逻辑直接放在 function 中: http://jsfiddle.net/83st9wgh/
const input = [{ "year": "2021", "cabin": "1", "months": ["1", "2"] }, { "year": "2021", "cabin": "1", "months": ["4"] }, { "year": "2021", "cabin": "2", "months": ["1", "2"] }, { "year": "2022", "cabin": "1", "months": ["1", "2"] }, { "year": "2022", "cabin": "1", "months": ["4"] }, { "year": "2022", "cabin": "2", "months": ["1", "2"] }]; const result = input.reduce((acc, { year, cabin, months }) => { const yearArray = (acc[year]??= []); let cIndex = yearArray.findIndex(o => o.cabin === cabin); if (cIndex === -1) { cIndex = yearArray.push({ cabin, months: [] }) - 1; } const monthsArray = yearArray[cIndex].months; yearArray[cIndex].months = [...new Set(monthsArray.concat(months))]; return acc; }, {}); console.log(JSON.stringify(result, null, 2));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.