使用来自多个数组的值筛选JavaScript对象
如果我有一个对象数组使用来自多个数组的值筛选JavaScript对象,javascript,arrays,Javascript,Arrays,如果我有一个对象数组 var products = [{ names: ["hammer", "nail", "rubber duck"], colors: ["yellow", "red", "pink"] }, { names: ["saw", "tractor", "bowling ball"], colors: ["gray", "purple", "green"] }] 然后我有一个带有过滤器值数组的对象
var products = [{
names: ["hammer", "nail", "rubber duck"],
colors: ["yellow", "red", "pink"]
},
{
names: ["saw", "tractor", "bowling ball"],
colors: ["gray", "purple", "green"]
}]
然后我有一个带有过滤器值数组的对象:
var filters = {names: ["saw", "bowling ball"], colors:["purple"]}
我需要过滤对象,这样如果没有过滤器,我就可以把所有对象都取回。如果我在“名称”中有任何过滤器值,我会用匹配的名称返回对象。如果我在“名称”和“颜色”中都有任何过滤器值,我会在这两个值上找到匹配的对象
例如:
var filters = {names: ["saw", "bowling ball"], colors:["purple"]}
会回来吗
[{
names: ["saw", "tractor" "bowling ball"],
colors: ["gray", "purple", "green"]
}]
您可以采用嵌套的方法,通过过滤给定的数组和对象中的所有项来获得想要的项并获取其键,获取数组并查看该值是否位于具有相同键的项列表中
var产品=[{名称:[“锤子”、“钉子”、“橡皮鸭”],颜色:[“黄色”、“红色”、“粉色”]},{名称:[“锯子”、“拖拉机”、“保龄球”],颜色:[“灰色”、“紫色”、“绿色”]},
过滤器={名称:[“锯”,“保龄球]],颜色:[“紫色”]},
结果=产品。过滤器(功能(p){
return Object.keys(filters).every(函数(k){
返回筛选器[k]。某些(函数(v){
返回p[k].indexOf(v)!=-1;
});
});
});
控制台日志(结果)代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
const filterProducts=(过滤器,产品)=>{
设len=products.length,i=0,
filteredProducts=[];
为了{
设filterLength=filter.length;
对于(设i=0;i你可以使用array#filter
迭代你的产品
数组,在数组中你可以使用array检查名称
和颜色
的存在
var产品=[{名称:[“锤子”、“钉子”、“橡皮鸭”],颜色:[“黄色”、“红色”、“粉色”]},{名称:[“锯子”、“拖拉机”、“保龄球”],颜色:[“灰色”、“紫色”、“绿色”]},
过滤器={名称:[“锯”,“保龄球]],颜色:[“紫色”]};
var result=products.filter({name,colors})=>{
返回filters.names.some(name=>name.includes(name))&&filters.colors.some(color=>colors.includes(color));
});
console.log(结果);
.as控制台包装{max height:100%!important;top:0;}
那么到目前为止您尝试了什么?显示代码
const filterProducts = (filter, products) => {
let len=products.length,i=0,
filteredProducts = [];
for(;i<len;i++) {
let product = products[i];
if(filters.names) {
let names = getMatch(filters.names, product.names);
if(names) {
if(!filteredProducts[i]) filteredProducts[i] = {};
filteredProducts[i].names = names;
};
}
if(filters.colors) {
let colors = getMatch(filters.colors, product.colors);
if(colors) {
if(!filteredProducts[i]) filteredProducts[i] = {};
filteredProducts[i].colors = colors;
};
}
}
if(filteredProducts.length) return filteredProducts;
return products;
}
const getMatch = (filter, values) => {
let filterLength = filter.length;
for(let i=0;i<filterLength;i++) {
if(values.indexOf(filter[i]) !== -1) return values;
}
}
let filtered = filterProducts(filters, products);
console.log(filtered);