簡體   English   中英

返回數組中每組具有最高屬性值的對象

[英]Return object(s) in array with highest property value per group

我有一個包含多個類似於以下對象的數組:

{person: {name: "Steve", id: 1}, role: 1}
{person: {name: "Phil", id: 2}, role: 1}
{person: {name: "Steve", id: 1}, role: 3}
{person: {name: "Phil", id: 2}, role: 6}

我的意圖是返回相同類型的數組,但是我想每個“人”僅返回一個具有最高作用的對象。

我了解以下內容將給我一個具有最高作用的對象。

array.reduce((prev, cur) => prev.role > cur.role ? prev : cur);

如何將每個唯一的人及其相應的最高角色作為新數組返回?

像這樣:

{person: {name: "Steve", id: 1}, role: 3}
{person: {name: "Phil", id: 2}, role: 6}

您需要收集對象,如果已經有一個具有相同id的對象,請檢查role並選擇更大的對象。

 var data = [{ person: { name: "Steve", id: 1 }, role: 1 }, { person: { name: "Phil", id: 2 }, role: 1 }, { person: { name: "Steve", id: 1 }, role: 3 }, { person: { name: "Phil", id: 2 }, role: 6 }], grouped = data.reduce((r, o) => { var index = r.findIndex(({ person: { id } }) => id === o.person.id); if (index === -1) { r.push(o); return r; } if (r[index].role < o.role) { r[index] = o; } return r; }, []); console.log(grouped); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

使用Array.reduce()person.id對項目進行分組,但對於每個id僅存儲角色最高的對象。 使用Object.values()轉換回數組:

 const data = [{ person: { name: "Steve", id: 1 }, role: 1 }, { person: { name: "Phil", id: 2 }, role: 1 }, { person: { name: "Steve", id: 1 }, role: 3 }, { person: { name: "Phil", id: 2 }, role: 6 }]; const result = Object.values(data.reduce((r, o) => { const id = o.person.id; if(!r[id] || r[id].role < o.role) r[id] = o; return r; }, [])); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

您可以使用Array.prototype.reduce並構建如下的對象文字。 使用person.name屬性值作為對象鍵,如果發現更高的值,則只需更新角色值:

 var people = [{ person: { name: "Steve", id: 1 }, role: 1 }, { person: { name: "Phil", id: 2 }, role: 1 }, { person: { name: "Steve", id: 1 }, role: 3 }, { person: { name: "Phil", id: 2 }, role: 6 }]; var highRoleByPerson = people.reduce((accum, el) => { if (accum[el.person.name]) { if (el.role > accum[el.person.name].role) { accum[el.person.name].role = el.role; } } else { accum[el.person.name] = { person: { name: el.person.name, id: el.person.id }, role: 0 }; } return accum; }, {}); console.log(highRoleByPerson); 

暫無
暫無

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

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