亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取具有相同名稱和ID的對象的最大值

如何獲取具有相同名稱和ID的對象的最大值

繁星淼淼 2023-08-18 16:28:49
我有一個如下所示的對象數組   [             {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"}     ]我想獲取具有相同“名稱”和“id”的最大值的對象并將其推入一個新數組中,預期輸出如下:   [     {value: 5, id: 1, name: "x"},     {value: 8, id: 1, name: "y"},     {value: 3, id: 2, name: "x"},     {value: 4, id: 2, name: "y"},   ]謝謝
查看完整描述

2 回答

?
catspeake

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);


查看完整回答
反對 回復 2023-08-18
?
幕布斯6054654

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)


查看完整回答
反對 回復 2023-08-18
  • 2 回答
  • 0 關注
  • 206 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號