簡體   English   中英

通過比較對象的屬性來過濾對象數組

[英]Filter array of objects by comparing their properties

我試圖在這個數組中找到一個對象的最高分,但結果不正確。 我們是否應該再次將分數重置為 0? 我試圖將 score 變量放在obj[i.class]下方,但沒有任何改變:

 function theScore (students) { var obj = {}; score = 0; for(i of students){ if(score < i.score) { obj[i.class] = { name: i.name, score: i.score }; }; }; return obj; }; console.log(theScore([ { name: 'Sara', score: 90, class: 'A' }, { name: 'Poyi', score: 85, class: 'B' }, { name: 'Adert', score: 74, class: 'A' }, { name: 'Shynta', score: 78, class: 'B' } ]));

期望的輸出:

{
A: { 
        name: 'Sara',
        score: 90
   },
B: {
        name: 'Poyi',
        score: 85
   }
}

你不能大量簡化函數的 obj 賦值嗎?

function theScore (students) {
    var obj = {};
    var score = 0;
    for(i of students){
        if(i.score > score ) { 
            score = i.score;     // Keep track of the highest-score-found-so-far
            obj = i;             // Keep track of the highest scoring object
        }
    }
    return obj;
}

找到最高分后,分數不會改變。 將分數更改為當前分數。 謝謝。 使用帶有 index(Array) 的對象,而不是帶有 map 的對象。 這應該有效。

function theScore (students) {
  var obj = [];
  score = 0;
  for(i of students){
    if(obj.length === 0) {
       obj.push( i );
    } else {
      for( var x = 0; x < obj.length; x++ ){
         if( i.score > obj[x].score ){
             obj.splice( x, 0, i );
             break;
         }
      }
      if( x === obj.length ){
        obj.push(i);
      }
    }
  };
  return obj;
};


console.log(theScore([
  {
    name: 'Sara',
    score: 90,
    class: 'A'
  },
  {
    name: 'Poyi',
    score: 85,
    class: 'B'
  },
  {
    name: 'Adert',
    score: 74,
    class: 'A'
  },
  {
    name: 'Shynta',
    score: 78,
    class: 'B'
  }
]));

你的代碼的問題是你沒有區分一個班級和另一個班級的學生分數。 當您找到更高的分數時,您也不會更新分數,因此每次循環運行時,每個學生的分數(除非它是 0)都將高於score ,並且您最終會得到列表中的最后一個分數。

編輯:編輯以顯示如何僅使用一個循環來執行此操作

你需要:

  1. 每個班級的成績
  2. 在學生上循環
  3. 將該學生的分數與該學生班級的班級高分進行比較
  4. 根據需要更新
  5. 重復直到完成。

 function theScore (students) { const highScoresByClass = {}; const scores = {A: 0, B: 0, C: 0}; for (const student of students){ const classHighScore = scores[student.class]; if(classHighScore < student.score) { scores[student.class] = student.score; highScoresByClass[student.class] = { name: student.name, score: student.score }; }; }; return highScoresByClass; }; console.log(theScore([ { name: 'Sara', score: 90, class: 'A' }, { name: 'Poyi', score: 85, class: 'B' }, { name: 'Adert', score: 74, class: 'A' }, { name: 'Shynta', score: 78, class: 'B' } ]));

您需要跟蹤已檢查的classes

Array.prototype.reduce替代方法是使用函數Array.prototype.reduce來構建所需的輸出。 如您所見,基本上,這種方法是跟蹤先前檢查過的classes

 function theScore (students) { return students.reduce((a, c) => { a[c.class] = (a[c.class] || (a[c.class] = c)); if (c.score > a[c.class].score) a[c.class] = c; return a; }, Object.create(null)); } console.log(theScore([ { name: 'Sara', score: 90, class: 'A' }, { name: 'Poyi', score: 85, class: 'B' }, { name: 'Adert', score: 74, class: 'A' }, { name: 'Shynta', score: 78, class: 'B' }]));
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您的代碼的問題實際上從未將實際對象分數進行比較,而是始終與 0 進行比較。

如果您真的想為此使用for in循環,您可以執行以下操作(對代碼稍作更改):

 var data = [ { name: 'Sara', score: 90, class: 'A' }, { name: 'Poyi', score: 85, class: 'B' }, { name: 'Adert', score: 74, class: 'A' }, { name: 'Shynta', score: 78, class: 'B' } ] function theScore (students) { var obj = {} for(i of students){ if(!obj[i.class] || obj[i.class].score < i.score) { obj[i.class] = {name: i.name, score: i.score} } } return obj } console.log(theScore(data))

或者你可以使用reduce並像這樣解決它:

 var data = [ { name: 'Sara', score: 90, class: 'A' }, { name: 'Poyi', score: 85, class: 'B' }, { name: 'Adert', score: 74, class: 'A' }, { name: 'Shynta', score: 78, class: 'B' } ] const maxByClass = (d) => d.reduce((r,{name, score, ...c}) => { r[c.class] = r[c.class] ? r[c.class].score > score ? r[c.class] : {name, score} : {name, score} return r }, {}) console.log(maxByClass(data))

由於reduce 返回一個累加器,我們只需要根據2 個類別中的哪一個分數較大並返回來分配正確的對象道具。

暫無
暫無

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

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