Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用来自多个数组的值筛选JavaScript对象_Javascript_Arrays - Fatal编程技术网

使用来自多个数组的值筛选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);