javascript - 如何使用 ES2016 按多个条件过滤对象数组?
问题描述
// all products
let products = [
{ name: "A", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'PLAID'}, size: 50 },
{ name: "B", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'WINDOWPANE'}, size: 60 },
{ name: "C", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "D", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'PLAID'}, size: 70 },
{ name: "E", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'WINDOWPANE'}, size: 80 },
{ name: "F", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "G", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'PLAID'}, size: 90 },
{ name: "H", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "I", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'WINDOWPANE'}, size: 80 }
];
// filters applied
let filters = {
fabricColor: [{"id": 'BLUE'}, {"id": 'BLACK'}],
pattern: [{'id': 'PLAID'}, {'id': 'WINDOWPANE'}]
};
var filtered = multiFilter(products, filters);
/**
* Multi-filter an array of objects
* @param {Array} array : list of elements to apply a multiple criteria filter
* @param {Object} filters: Contains multiple criteria filters by the property names of the objects to filter
* @return {Array}
*/
function multiFilter(array, filters) {
let filterKeys = Object.keys(filters);
// filters all elements passing the criteria
let filterData = array.filter((item) => filterKeys.every((key) => (filters[key].indexOf(item[key]) !== -1)));
return filterData
}
// expected result
let expected = [
{ name: "A", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'PLAID'}, size: 50 },
{ name: "B", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'WINDOWPANE'}, size: 60 },
{ name: "D", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'PLAID'}, size: 70 },
{ name: "E", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'WINDOWPANE'}, size: 80 }
];
我尝试使用上面的代码,但无法根据过滤条件进行过滤。过滤结果应与预期结果匹配。
非常感谢您的帮助或任何参考。
解决方案
你可以filter
得到如下结果
let products = [
{ name: "A", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'PLAID'}, size: 50 },
{ name: "B", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'WINDOWPANE'}, size: 60 },
{ name: "C", fabricColor: {"id": 'BLUE'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "D", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'PLAID'}, size: 70 },
{ name: "E", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'WINDOWPANE'}, size: 80 },
{ name: "F", fabricColor: {"id": 'BLACK'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "G", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'PLAID'}, size: 90 },
{ name: "H", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'SOLID'}, size: 100 },
{ name: "I", fabricColor: {"id": 'GREEN'}, pattern: {'id': 'WINDOWPANE'}, size: 80 }
];
// filters applied
let filters = {
fabricColor: [{"id": 'BLUE'}, {"id": 'BLACK'}],
pattern: [{'id': 'PLAID'}, {'id': 'WINDOWPANE'}]
};
let res = products.filter(d => Object.entries(filters).every(([k ,v]) =>
Object.values(v).map(m => m.id).includes(d[k].id) ))
console.log(res)
推荐阅读
- c# - 用户名参数无效-CMOS
- r - 从 R 中具有不同列和长度的两个数据帧中选择并组合行
- javascript - 如何使“Ckeditor-5 文档编辑器”禁用或只读
- python - 使用“matplotlib.pyplot()”绘制数据时出现奇怪的结果
- sql - sql query for row replacing with another row
- mysql - 将大量数据存储为单个 JSON 字段 - 将重要字段提取到自己的字段中?
- php - PHP - 从我实例化我的对象的类中调用一个方法
- javascript - 如何在 n 个对象数组中进行交集?
- javascript - 如何集成 Ionic 4 + AngularJS (1.7.2) + Webpack + Cordova?
- c# - DataGrid 中的 WPF 样式单元格和行