如何将js数组中对象的属性值相等的对象组合成一个新的数组元素,然后返回一个新的数组?-灵析社区

winkkkkk9421

将js数组中对象的属性值相等的对象组合成一个新的数组元素。 可以使用reduce、map等函数 比如: // 原始数组 const arr = [ {title: '标题1', url: 'url', groupId: -1}, {title: '标题2', url: 'url', groupId: 123}, {title: '标题3', url: 'url', groupId: 123}, {title: '标题4', url: 'url', groupId: -1}, {title: '标题5', url: 'url', groupId: 456}, {title: '标题6', url: 'url', groupId: 456}, {title: '标题6', url: 'url', groupId: 789}, ] // 期望结果 const resArr = [ {title: '标题1', url: 'url'}, {groupId: 123, group: [{title: '标题2', url: 'url'}, {title: '标题3', url: 'url'}]}, {title: '标题4', url: 'url'}, {groupId: 456, group: [{title: '标题5', url: 'url'}, {title: '标题6', url: 'url'}]} ] 如果 `groupId` 为-1,则删除其`groupId`属性,并按顺序将该元素加入新的数组中即可 另外:arr数组中相同groupId的元素在数组中的位置**总是相邻** 的。(groupId为-1的除外) 比如: // 正例 const arr = [ {title: '标题1', url: 'url', groupId: -1}, {title: '标题2', url: 'url', groupId: 123}, {title: '标题3', url: 'url', groupId: 123}, {title: '标题4', url: 'url', groupId: -1}, {title: '标题5', url: 'url', groupId: 456}, {title: '标题6', url: 'url', groupId: 456}, {title: '标题4', url: 'url', groupId: -1}, ] // 反例 const arr = [ {title: '标题1', url: 'url', groupId: -1}, {title: '标题2', url: 'url', groupId: 123}, {title: '标题4', url: 'url', groupId: -1}, {title: '标题3', url: 'url', groupId: 123}, {title: '标题5', url: 'url', groupId: 456}, {title: '标题5', url: 'url', groupId: 789}, {title: '标题6', url: 'url', groupId: 456}, ]

阅读量:16

点赞量:0

问AI
你可以看看是否满足你需求,reduce的别样用法 算了,我更新一下,直接给groupId取掉了,你看第二次的,第一次我还保留 const arr = [ { title: '标题1', url: 'url', groupId: -1 }, { title: '标题2', url: 'url', groupId: 123 }, { title: '标题3', url: 'url', groupId: 123 }, { title: '标题333', url: 'url', groupId: 123 }, { title: '标题4', url: 'url', groupId: -1 }, { title: '标题5', url: 'url', groupId: 456 }, { title: '标题6', url: 'url', groupId: 456 }, ] const res = arr.reduce((previous, current) => { const len = previous.length const last = len && previous[len - 1] if (last.groupId === current.groupId) { // 如果标题4上面还有一个groupId为123的走这个 if (last.group) { last.group.push({ ...current }) } else { previous[len - 1] = { groupId: last.groupId, group: [{ ...last }, { ...current }] } } } else { previous.push(current) } return previous }, []) console.log(res) /* [ { "title": "标题1", "url": "url", "groupId": -1 }, { "groupId": 123, "group": [ { "title": "标题2", "url": "url", "groupId": 123 }, { "title": "标题3", "url": "url", "groupId": 123 }, { "title": "标题333", "url": "url", "groupId": 123 } ] }, { "title": "标题4", "url": "url", "groupId": -1 }, { "groupId": 456, "group": [ { "title": "标题5", "url": "url", "groupId": 456 }, { "title": "标题6", "url": "url", "groupId": 456 } ] } ] */ -----第二次----- const arr = [ { title: '标题1', url: 'url', groupId: -1 }, { title: '标题2', url: 'url', groupId: 123 }, { title: '标题3', url: 'url', groupId: 123 }, { title: '标题333', url: 'url', groupId: 123 }, { title: '标题4', url: 'url', groupId: -1 }, { title: '标题5', url: 'url', groupId: 456 }, { title: '标题6', url: 'url', groupId: 456 }, ] const res = arr.reduce((previous, current) => { const len = previous.length const last = len && previous[len - 1] if (last.groupId === current.groupId) { // 如果标题4上面还有一个groupId为123的走这个 if (last.group) { const { groupId: _2, ...currentData } = current last.group.push({ ...currentData }) } else { const { groupId: _1, ...firstData } = last const { groupId: _2, ...currentData } = current previous[len - 1] = { groupId: last.groupId, group: [{ ...firstData }, { ...currentData }] } } } else { if (current.groupId === -1) delete current.groupId previous.push(current) } return previous }, []) console.log(res) /* [ { "title": "标题1", "url": "url"}, { "groupId": 123, "group": [ { "title": "标题2", "url": "url" }, { "title": "标题3", "url": "url" }, { "title": "标题333", "url": "url" } ] }, { "title": "标题4", "url": "url" }, { "groupId": 456, "group": [ { "title": "标题5", "url": "url" }, { "title": "标题6", "url": "url" } ] } ] */