我试图在此数组中的某个对象上找到最高分,但结果不正确。我们是否应该将分数重新设置为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
}
}
答案 0 :(得分:1)
您不能大量简化函数的obj分配吗?
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'
}
]));
答案 1 :(得分:0)
找到最高分数后分数不会改变。将分数更改为当前分数。谢谢。代替带有map的对象,而使用带有index(Array)的对象。这应该起作用。
mChart.extraTopOffset = 20
答案 2 :(得分:0)
代码的问题在于,您在一个班级和另一个班级的学生成绩之间没有任何区别。当您找到更高的分数时,您也不会更新分数,因此每次循环时,每个学生的分数(除非它为0)都将高于requestExecutors(numAdditionalExecutors: Int)
,而您最终得到列表中的最后一个分数
编辑:编辑后仅显示一个循环即可完成
您需要:
score
答案 3 :(得分:0)
您需要跟踪已检查的classes
。
更清洁的替代方法是使用函数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; }
答案 4 :(得分: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返回一个累加器,我们只需要根据两个类得分之一较大并返回的值来分配正确的对象prop。