js如何合并对象数组中的某些项?

发布于 2022-09-11 16:41:46 字数 1148 浏览 22 评论 0

源数据:

data: [
{
    parkId: 1,
    scheduleId: 1,
    hasStock: false
},
{
    parkId: 1,
    scheduleId: 2,
    hasStock: false
},
{
    parkId: 1,
    scheduleId: 3,
    hasStock: false
},
{
    parkId: 2,
    scheduleId: 1,
    hasStock: false
},
{
    parkId: 2,
    scheduleId: 2,
    hasStock: false
},
{
    parkId: 2,
    scheduleId: 3,
    hasStock: false
}
]

期望是将parkId相同的项合并组成以下格式:

[
    {
        parkId: 1,
        date: [
            {
                scheduleId: 1,
                hasStock: false
            },
            {
                scheduleId: 2,
                hasStock: false
            },
            {
                scheduleId: 3,
                hasStock: false
            }
        ]
    },
    {
        parkId: 2,
        date: [
            {
                scheduleId: 1,
                hasStock: false
            },
            {
                scheduleId: 2,
                hasStock: false
            },
            {
                scheduleId: 3,
                hasStock: false
            }
        ]
    }
]

各位大佬有没有什么比较优雅的方式

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

第七度阳光i 2022-09-18 16:41:46
data.map(d => d.parkId).filter((v, idx, arr) => arr.indexOf(v) === idx).map(parkId => {
  let d = {parkId, data: []}
  d.data = data.filter(item => item.parkId === parkId).map(item => {
    return {
        scheduleId: item.scheduleId,
        hasStock: item.hasStock
    }
  })
  return d
})

不过谈不上优雅。

痴骨ら 2022-09-18 16:41:46
let uniqueObj = {};
let result = data.map( item => {
    return {
        parkId: item.parkId,
        data: data.filter( childItem => childItem.parkId === item.parkId)
    }
}).reduce( (array, item) => {
    if(!uniqueObj[`parkId${item.parkId}`]) {
        array.push(item);
        uniqueObj[`parkId${item.parkId}`] = true;
    }
    return array;
}, []);
uniqueObj = null; //解除内存占用
console.log(result);
风筝有风,海豚有海 2022-09-18 16:41:46
let aux={}
let result=[]
data.forEach(obj=>{
  let {parkId,...restProps}=obj
  if(!aux[parkId]) aux[parkId]={ parkId, data:[] }
  aux[parkId].data.push({...restProps})
})
for(let key in aux){
  result.push(aux[key])
}

使用aux作为一个储存中介,可以支持乱序

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文