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)
有没有办法更有效地这样做?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |