簡體   English   中英

基於鍵和值分組的 JavaScript 對象數組

[英]JavaScript array of objects grouping based on key and value

 let data = [ {news: id1, users: [{user1}, {user2}, {user3}]}, {news: id2, users: [{user2}, {user4}, {user6}]}, {news: id3, users: [{user1}, {user2}, {user4}]} ]

因此,根據上述數據,我需要能夠將新聞項目分組以形成模板(讓我們考慮一個模板嚴格由兩個新聞項目組成)。 然后對於每個模板,我需要匹配相應的用戶。 最后,當我完成所有模板的創建后,我需要將剩余的用戶映射到他們各自的新聞項目。

我在下面添加了一個示例輸出

 [id1,id2] : [user2] [id2, id3] : [user2, user4] [id3, id1] : [user1, user2] [id2] : [user6] [id1] : [user3]

我如何實現這一目標?

您可以使用哈希表並通過檢查值的長度來構建所需的結構,如果大於 2,則采用值的組合將新組添加到結果集中,而不是給定的組。

 var data = [{ news: 'id1', users: ['user1', 'user2', 'user3'] }, { news: 'id2', users: ['user2', 'user4', 'user6'] }, { news: 'id3', users: ['user1', 'user2', 'user4'] }], cool = data.reduce((r, { news, users }) => users.reduce((o, user) => ((o[user] = o[user] || []).push(news), o), r), {}), result = Object.entries(cool).reduce((r, [user, news]) => { function add(k, v) { var temp = r.find(([a]) => a.join('|') === v.join('|')); if (!temp) r.push(temp = [v, []]); temp[1].push(k); } if (news.length > 2) { news.reduce((r, v, i, a) => r.concat(a.slice(i + 1).map(w => [v, w])), []) .forEach(news => add(user, news)); } else { add(user, news); } return r; }, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM