2 回答

TA貢獻1111條經驗 獲得超0個贊
你可以使用reduce方法來做到這一點,
const data = [
{value: 1, id: 1, name: "x"},
{value: 5, id: 1, name: "x"},
{value: 1, id: 1, name: "y"},
{value: 8, id: 1, name: "y"},
{value: 1, id: 2, name: "x"},
{value: 3, id: 2, name: "x"},
{value: 1, id: 2, name: "y"},
{value: 4, id: 2, name: "y"}
]
const res = data.reduce((prev, curr) => {
const index = prev.findIndex((item) => item.id === curr.id && item.name === curr.name);
if(index > -1) {
const obj = prev[index];
if(obj.value < curr.value) {
prev[index] = {...obj, value: curr.value};
return prev;
}
}
prev.push(curr);
return prev;
}, []);
console.log(res);

TA貢獻1876條經驗 獲得超7個贊
Reduce用于從數組中的所有項返回一個新值,該值基本上是累加器(與先前的值相加)。在這里我們可以使用它使用特定鍵對項目進行分組。正如您所寫,您希望項目顯示具有相同 id 和名稱的最大值的記錄,這些值可以作為鍵(讓我們將它們視為該對象的復合私鑰)。
在每次迭代中,我們檢查是否已經有一個帶有該鍵的對象添加到列表中,如果沒有,我們添加我們現在所在的對象(在迭代期間),或者如果它的值小于我們當前所在的對象。如果該值較小,我們將使用當前對象覆蓋該對象。
最后,我們使用 JS?Object.values方法去除鍵并僅返回對象的值。
const list = [?
? {value: 1, id: 1, name: "x"},
? {value: 5, id: 1, name: "x"},
? {value: 1, id: 1, name: "y"},
? {value: 8, id: 1, name: "y"},
? {value: 1, id: 2, name: "x"},
? {value: 3, id: 2, name: "x"},
? {value: 1, id: 2, name: "y"},
? {value: 4, id: 2, name: "y"}
?];
const groupedResults = list.reduce((result, currentObject) => {
? const currentKey = currentObject.id + currentObject.name;
? if (!result[currentKey] || result[currentKey].value <? ?currentObject.value) { /* Here we check if object with certain key was assigned to previously or if it was is the value smaller than of the object that we are currently seeing */
? ? result[currentKey] = Object.assign({}, currentObject) //We need to do copy of the object (it can be also done using object destructuring) in order to have a new object that will not be bound by reference with the original one
? };
? return result;
}, {});
const requestedList = Object.values(groupedResults);
console.log(requestedList)
添加回答
舉報