gpt4 book ai didi

javascript - 如何使用 ES2016 按多个条件过滤对象数组?

转载 作者:行者123 更新时间:2023-11-28 17:16:07 25 4
gpt4 key购买 nike

// 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 }
];

我尝试使用上面的代码,但无法根据过滤条件进行过滤。过滤结果应与预期结果匹配。

没有什么帮助或任何引用,非常感谢。

最佳答案

您可以像下面一样过滤您的结果

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)

关于javascript - 如何使用 ES2016 按多个条件过滤对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53465137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com