[英]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
,並且您最終會得到列表中的最后一個分數。
編輯:編輯以顯示如何僅使用一個循環來執行此操作
你需要:
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.