通过传递键&;从数组中获取对象;javascript中的值

通过传递键&;从数组中获取对象;javascript中的值,javascript,arrays,object,javascript-objects,Javascript,Arrays,Object,Javascript Objects,这是我的对象数组。我想通过在函数中传递查询来过滤对象 const产品=[{ 名称:“A”, 颜色:“蓝色”, 尺码:50 }, { 名称:“B”, 颜色:“蓝色”, 尺码:60 }, { 名称:“C”, 颜色:“黑色”, 尺码:70 }, { 名称:“D”, 颜色:“绿色”, 尺码:50 } ]; 我期望的输出将从我传递的查询中筛选出来,该函数可以是任何东西 { 名称:“A”, 颜色:“蓝色”, 尺码:50 }, { 名称:“C”, 颜色:“黑色”, 尺码:70 } 这是我将传递给函数的查询

这是我的对象数组。我想通过在函数中传递查询来过滤对象

const产品=[{
名称:“A”,
颜色:“蓝色”,
尺码:50
},
{
名称:“B”,
颜色:“蓝色”,
尺码:60
},
{
名称:“C”,
颜色:“黑色”,
尺码:70
},
{
名称:“D”,
颜色:“绿色”,
尺码:50
}
];
我期望的输出将从我传递的查询中筛选出来,该函数可以是任何东西

{
名称:“A”,
颜色:“蓝色”,
尺码:50
}, {
名称:“C”,
颜色:“黑色”,
尺码:70
}
这是我将传递给函数的查询对象

const过滤器={
颜色:[“蓝色”、“黑色”],
尺寸:[70,50]
};
这是我的函数,我可以将其分配给其他变量,并将其用于进一步的操作

const filteredData = filterIt(products, filter);

您可以获取筛选器对象的条目,并获取键和值,以便使用
includes
进行检查

const
filterBy=filter=>o=>Object.entries(filter).every([k,v])=>v.includes(o[k]),
filterIt=(数组,筛选器)=>array.filter(filterBy(筛选器)),
产品=[{名称:“A”,颜色:“蓝色”,尺寸:50},{名称:“B”,颜色:“蓝色”,尺寸:60},{名称:“C”,颜色:“黑色”,尺寸:70},{名称:“D”,颜色:“绿色”,尺寸:50}],
过滤器={color:[“Blue”,“Black”],大小:[70,50]},
filteredData=filterIt(产品、过滤器);
console.log(filteredData)

.as控制台包装{max height:100%!important;top:0;}
这里是另一个选项:

function filterIt(products, filter) {
  return products.filter(p => {
    for (const k in filter) {
      if (filter[k].indexOf(p[k]) === -1) {
        return false;
      }
    }
    return true;
  })
}

如果您想使用OR而不是AND,则在逻辑中修改的前一个函数为:

function filterIt(products, filter) {
  return products.filter(p => {
    for (const k in filter) {
      // if a value of any property of the product is contained in a filter array, include it
      if (filter[k].indexOf(p[k]) !== -1) {
        return true;
      }
    }
    return false;
  })
}
这一个也见a:)

const产品=[{
名称:“A”,
颜色:“蓝色”,
尺码:50
},
{
名称:“B”,
颜色:“蓝色”,
尺码:60
},
{
名称:“C”,
颜色:“黑色”,
尺码:70
},
{
名称:“D”,
颜色:“绿色”,
尺码:50
}
];
常数过滤器={
颜色:[“蓝色”、“黑色”],
尺寸:[70,50]
};
让filterIt=(产品、过滤器)=>{
返回产品。过滤器(p=>{
//获取所有筛选器密钥
让keys=Object.keys(过滤器);
设validkeys=[];
keys.forEach(k=>{
//检查筛选器属性是否存在并包含筛选器值
if(p.hasOwnProperty(k)&过滤器[k]。包括(p[k])){
validkeys.push(真);
}
})
//检查所有筛选器匹配
返回validkeys.length==keys.length;
});
}
常量filteredData=filterIt(产品、过滤器);

log(“…Filteredata”,Filteredata)这就是我的问题所在。//函数const filterIt=(data,filter)=>{//console.log(filter);for(let i=0;iBlue
,但大小不同于
70
50
?我在寻找包含不同大小对象的代码谢谢你的帮助,但我想知道一件你已经问过的事情。比如,如果我想包含蓝色但大小不同的值。在经过同样的地方query@jeetdeveloper查看更新的我的答案,包括另一个演示:。请注意,这是所有过滤器中的OR,而不仅仅是
颜色
大小
。如果您有任何疑问,请告诉我;)如果您想进行更复杂的比较,同时保持函数的通用性,那么您可能需要使
过滤器
对象更复杂,并在其中包含您想要执行的比较类型以及类似的内容。否则,如果您只想坚持使用
大小
,您可以直接检查
大小
属性,如果该属性存在,则无论颜色匹配与否,都可以保留该产品在最终结果中。感谢您的帮助,但我想知道您已经询问的一件事。比如,如果我想包含蓝色但大小不同的值。在经过同样的地方query@jeetdeveloper然后按下有效的过滤键validkeys.push(k);然后,可以确定有效的产品,如返回validkeys.includes('color')。这一切都是关于操纵过滤器条件的。