【发布时间】:2018-11-29 14:07:54
【问题描述】:
在下面的 sn-p 中,我们需要根据不同的 AND , OR 条件过滤数组。 条件
- 如果过滤器对象的“isFiltered”为真,它应该过滤。
- PatternGroupCode "OTHER" 表示它包括除那些以外的所有面料 标记为“isFiltered”的面料为假。
- fabricColor 应用了相同的“OTHER”条件。
我可以使用 fabricColor id 进行过滤。但不能使用patternGroupCode。
// all products
let products = [
{ name: "A", fabricColorGroupCodes:["OTHER"], patternGroupCode: 'PLAID', size: 50 },
{ name: "B", fabricColorGroupCodes:["BLUE"], patternGroupCode: 'WINDOWPANE', size: 60 },
{ name: "C", fabricColorGroupCodes:["OTHER", "BLUE"], patternGroupCode: 'SOLID', size: 100 },
{ name: "D", fabricColorGroupCodes:["OTHER", "BLACK"], patternGroupCode: 'PLAID', size: 70 },
{ name: "E", fabricColorGroupCodes:["BLACK"], patternGroupCode: 'WINDOWPANE', size: 80 },
{ name: "F", fabricColorGroupCodes:["BLACK"], patternGroupCode: 'SOLID', size: 100 },
{ name: "G", fabricColorGroupCodes:["GREEN"], patternGroupCode: 'PLAID', size: 90 },
{ name: "H", fabricColorGroupCodes:["GREEN"], patternGroupCode: 'SOLID', size: 100 },
{ name: "I", fabricColorGroupCodes:["GREEN"], patternGroupCode: 'WINDOWPANE', size: 80 },
{ name: "J", fabricColorGroupCodes:["GREEN"], patternGroupCode: 'PAISLEY', size: 80 }
];
function multiFilter(array, filters) {
return array.filter(d => (
Object.entries(filters).every(([k ,v]) => (
Object.values(v).map(m => m.id).includes(d[k].id)
))
));
}
// filter conditions
// here we choose OTHER so it will filter on color BLACK and GREEN and
// omit the BLUE because isFilter tag is false, same for patternGroupCode.
// so here it filter on SOLID , PLAID and WINDOWPANE and will omit PAISLEY .
let filters = {
fabricColor: [
{"id": 'BLACK', "isFiltered": true},
{"id": 'BLUE', "isFiltered": false},
{"id": 'OTHER', "isFiltered": true}
],
patternGroupCode: [
{"patternGroupCode": 'OTHER', "isFiltered": true},
{"patternGroupCode": 'STRIPES', "isFiltered": false},
{"patternGroupCode": 'PLAID', "isFiltered": true},
{"patternGroupCode": 'PAISLEY', "isFiltered": false},
{"patternGroupCode": 'SOLID', "isFiltered": true}
]
};
var filtered = multiFilter(products, filters);
console.log(filtered);
【问题讨论】:
-
只是另一个问题,您能否将数据格式更改为对过滤器更友好的方式,即使用一对键/值对而不是高度特殊的名称或嵌套对象结构?
-
顺便说一句,第二个,第三个,...过滤 AND 或 OR 条件?
-
面料颜色和patternGroupCode有AND条件
-
你能建议过滤器友好的数据格式,所以我会相应地更新
-
要理解,代码中的当前过滤器意味着颜色不是蓝色且图案不是(条纹或佩斯利)?另外,过滤器中是否可能没有
OTHER,如果是,预期的输出是什么?
标签: javascript arrays filter