我有两个数组。一个拿着产品,另一个拿着过滤器(衬衫,裤子等)。所有产品都有类型属性,可以是衬衫,裤子等,与过滤器相对应。
我试图制作一个选择器,它会返回一个新数组,错过任何类型与任何过滤器匹配的产品。
export function filterProducts(products, filters) {
return products.filter((item) => {
return item.type === "hat";
});
};
与此类似,除了明显检查每个过滤器,而不仅仅是"帽子"。我可以想到一些方法来实现这一点,但我试图找出更优雅的东西。我知道我必须循环一个循环,但我不能让它正常工作。 ES6 / lodash等都很好。
答案 0 :(得分:1)
假设filters
是包含您要查找的类型的字符串数组,您可以使用Array.prototype.some
搜索filters
数组来过滤它。
var products = [
{
name: 'Foo',
type: 'hat'
},
{
name: 'Bar',
type: 'shirt'
},
{
name: 'Baz',
type: 'pants'
},
{
name: 'Foobar',
type: 'hat'
},
{
name: 'Falsy Type',
type: ''
},
],
filters = ['hat', 'pants', ''];
function filterProducts(products, filters) {
return products.filter((item) => {
return !filters.some(filter => item.type === filter);
});
};
console.log(filterProducts(products, filters));

答案 1 :(得分:1)
另一种看法!
'use strict'
const filters = ['hat','shirt','pant'];
const products = [{
sku: 101,
type: 'hat'
}, {
sku: 102,
type: 'hat'
}, {
sku: 103,
type: 'shirt'
}, {
sku: 104,
type: 'pant'
}, {
sku: 101,
type: 'pant'
}, {
sku: 101,
type: 'shirt'
}]
const filterize = function (products, filters){
let map = {};
filters.forEach(function(filter){
map[filter] = [];
})
products.forEach(function(product){
if(typeof map[product.type] !== undefined){
map[product.type].push(product);
}
})
return map;
}
console.log(filterize(products, filters));
这将返回一个地图,其中过滤器作为键和值作为与过滤器对应的产品列表。以下示例输出:
{ hat: [ { sku: 101, type: 'hat' }, { sku: 102, type: 'hat' } ],
shirt: [ { sku: 103, type: 'shirt' }, { sku: 101, type: 'shirt' } ],
pant: [ { sku: 104, type: 'pant' }, { sku: 101, type: 'pant' } ] }