有没有更有效的方法来过滤这个对象数组?

Wes*_*Wes 3 javascript arrays filter

我正在使用这个对象数组,我尝试根据匹配的主题对其进行过滤和重新排序.该数组看起来有点像这样:

const results = [
  {id: 1, subject: 'biology', grade: 10},
  {id: 2, subject: 'biology', grade: 3},
  {id: 3, subject: 'math', grade: 4},
  {id: 4, subject: 'biology', grade: 2},
  {id: 5, subject: 'geography', grade: 1},
  {id: 6, subject: 'physics', grade: 3}
]
Run Code Online (Sandbox Code Playgroud)

未来很可能会增加更多的主题.使用过多的过滤方法,我可以按照我想要的方式安排它们:

var filteredObj = {};

filteredObj['biology'] = this.results.filter(function (result) {
    return result.subject === 'biology';
});
filteredObj['math'] = this.results.filter(function (result) {
    return result.subject === 'math';
});
filteredObj['physics'] = this.results.filter(function (result) {
    return result.subject === 'physics';
});
filteredObj['geography'] = this.results.filter(function (result) {
    return result.subject === 'geography';
});
Run Code Online (Sandbox Code Playgroud)

有没有办法更有效地这样做?

Ori*_*ori 5

您可以使用Array.reduce()按主题对项目进行分组:

const results = [{"id":1,"subject":"biology","grade":10},{"id":2,"subject":"biology","grade":3},{"id":3,"subject":"math","grade":4},{"id":4,"subject":"biology","grade":2},{"id":5,"subject":"geography","grade":1},{"id":6,"subject":"physics","grade":3}];

const grouped = results.reduce((r, o) => {
  r[o.subject] = r[o.subject] || [];
  
  r[o.subject].push(o);

  return r;
}, Object.create(null));

console.log(grouped);
Run Code Online (Sandbox Code Playgroud)

并且很容易创建更通用的groupBy功能:

const groupBy = (prop, arr) => arr.reduce((r, o) => {
  r[o[prop]] = r[o[prop]] || [];
  
  r[o[prop]].push(o);

  return r;
}, Object.create(null));

const results = [{"id":1,"subject":"biology","grade":10},{"id":2,"subject":"biology","grade":3},{"id":3,"subject":"math","grade":4},{"id":4,"subject":"biology","grade":2},{"id":5,"subject":"geography","grade":1},{"id":6,"subject":"physics","grade":3}];

const grouped = groupBy('subject', results);

console.log(grouped);
Run Code Online (Sandbox Code Playgroud)