繁体   English   中英

按多个属性分组对象并合并数组属性

[英]Group objects by multiple properties and merge array property

在示例中,我使用每个到 go 到 select 字段并创建一个数据数组,我需要将 2 个属性yearcabin分组,属性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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM