简体   繁体   English

使用.filter过滤对象数组

[英]Filter an array of objects with .filter

If have a JSON object, how can I use.filter to filter my array based on a filters object. 如果有JSON对象,如何使用.filter根据过滤器对象过滤数组。

data = [
   {month: 'Sep', name: 'Fred', department: 'Accounting'},
   {month: 'Sep', name: 'David', department: 'Sales'},
   {month: 'Oct', name: 'Jon', department: 'Sales'}
]

filters = {
    month: [],
    name: ['Jon'],
    department: ['Sales','Accounting']
}
 const result = data.filter(entry => {
   for(var key in filters){
     if(filters[key].length && !filters[key].includes(entry[key]) )
        return false;
   }
   return true;
});

You could filter your data by checking every filter's key to exist in the object and that its value is included in the filtering array. 你可以filter通过检查每一个过滤器的主要的对象和它的值包含过滤数组中存在的数据

You can do this with filter() and every() methods. 您可以使用filter()every()方法执行此操作。

 var data = [ {month: 'Sep', name: 'Fred', department: 'Accounting'}, {month: 'Sep', name: 'David', department: 'Sales'}, {month: 'Oct', name: 'Jon', department: 'Sales'} ] var filters = { month: [], name: ['Jon'], department: ['Sales','Accounting'] } var result = data.filter(e => { return Object.keys(filters).every(f => { return filters[f].includes(e[f]) || !filters[f].length }) }) console.log(result) 

 let data = [ { month: 'Sep', name: 'Fred', department: 'Accounting' }, { month: 'Sep', name: 'David', department: 'Sales' }, { month: 'Oct', name: 'Jon', department: 'Sales' } ]; let filters = { month: [], name: ['Jon'], department: ['Sales', 'Accounting'] }; let matches = data.filter(function (o) { // iterate through keys of filter object for (const key in this) { // if filter array is empty and // value is not in filter array if (this[key].length > 0 && !this[key].includes(o[key])) { // object is not match return false; } } // if object passed every filter array // object is match return true; }, filters); console.log(matches); 

A more compact way of writing it could be like this: 一种更紧凑的编写方式可能是这样的:

 let data = [ { month: 'Sep', name: 'Fred', department: 'Accounting' }, { month: 'Sep', name: 'David', department: 'Sales' }, { month: 'Oct', name: 'Jon', department: 'Sales' } ]; let filters = { month: [], name: ['Jon'], department: ['Sales', 'Accounting'] }; let matches = data.filter(function (o) { return Object.keys(this).every( key => this[key].length === 0 || this[key].includes(o[key]) ); }, filters); console.log(matches); 

data.filter(obj => filters.month.indexOf(obj.month) > -1 && filters.name.indexOf(obj.name) > -1 && filters.department.indexOf(obj.department) > -1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM