假設一個具有不一致屬性的陣列,如下所示:
[
{user: 'user1', comment: 'This is a comment',},
{user: 'user1', role: 'member'},
{user: 'user1', role: 'writer'},
{user: 'user2', role: 'admin'},
{user: 'user1', comment: 'This is another comment'},
]
如何將其轉換為僅當陣列中的下一個元素具有相同屬性且屬于同一用戶時才會對物件進行分組:
[
{user: 'user1', comment: 'This is a comment'},
{user: 'user1', role: [{'member', 'writer'}]},
{user: 'user2', role: 'admin'},
{user: 'user1', comment: 'This is another comment'},
]
uj5u.com熱心網友回復:
你可以試試這樣的遞回函式
let data = [
{user: 'user1', comment: 'This is a comment',},
{user: 'user1', role: 'member'},
{user: 'user1', role: 'writer'},
{user: 'user2', role: 'admin'},
{user: 'user1', comment: 'This is another comment'},
]
let combined = []
const combineRole = (curr, next, data) => {
if (curr.user == next?.user) {
curr.role = [curr.role, next.role].flat().filter(Boolean)
return combineRole(curr, data.shift(), data)
} else {
return [curr, next]
}
}
while (data.length) {
console.log(data)
let [curr, next] = (combineRole(data.shift(), data.shift(), data))
if(next)
data.unshift(next)
combined.push(curr)
}
console.log(combined)
uj5u.com熱心網友回復:
您可以使用 reduce 來制作類似的東西
const datas = [
{ user: 'user1', comment: 'This is a comment', },
{ user: 'user1', role: 'member' },
{ user: 'user1', role: 'writer' },
{ user: 'user2', role: 'admin' },
{ user: 'user1', comment: 'This is another comment' },
]
const datas2 = datas.reduce((s, d, x) => {
if (x > 0) {
const dk = Object.keys(d)
if (dk.join(',') === Object.keys(s[s.length - 1]).join(',') && d.user === s[s.length - 1].user) {
for (const k in dk) {
if (dk[k] !== 'user' && d.hasOwnProperty(dk[k]) && s[s.length - 1].hasOwnProperty(dk[k])) {
if (typeof s[s.length - 1][dk[k]] !== 'object')
s[s.length - 1][dk[k]] = [s[s.length - 1][dk[k]]]
s[s.length - 1][dk[k]].push(d[dk[k]])
}
}
return s
}
}
return s.concat(d)
}, [])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/416672.html
標籤:
