通过比较对象的属性来过滤对象数组

时间:2018-11-11 13:37:26

标签: javascript arrays object

我试图在此数组中的某个对象上找到最高分,但结果不正确。我们是否应该将分数重新设置为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
   }
}

5 个答案:

答案 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),而您最终得到列表中的最后一个分数

编辑:编辑后仅显示一个循环即可完成

您需要:

  1. 每个课程的成绩得分
  2. 围拢学生
  3. 将学生的分数与该学生的班级的高分进行比较
  4. 根据需要更新
  5. 重复直到完成。

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。