Javascript 使用多个筛选值筛选对象
我有一个对象,它有三个不同的数组,比如location vertical和roundType,我将得到一个filter对象,该对象中有相同的三个数组。这是需要过滤的数据Javascript 使用多个筛选值筛选对象,javascript,reactjs,Javascript,Reactjs,我有一个对象,它有三个不同的数组,比如location vertical和roundType,我将得到一个filter对象,该对象中有相同的三个数组。这是需要过滤的数据 testObject = [{ "id": 1892928, "vertical_tax": [ 678, 664 ], "location_tax": [ 666 ], "roundType": [ "rt1" ], } {
testObject = [{
"id": 1892928,
"vertical_tax": [
678,
664
],
"location_tax": [
666
],
"roundType": [
"rt1"
],
}
{
"id": 1892927,
"vertical_tax": [
662,
663
],
"location_tax": [
663
],
"roundType": [
"rt2"
],
}]
这是应该根据其进行筛选的筛选对象
filterObject = {
locations: [666,667]
roundTypes: ["rt1","rt2"]
verticals: [662,661]
}
最初的要求是:获取任何一个过滤器对象数组中具有特定值的对象。这可以通过使用“some”来实现。
更新要求:所以我需要用filterObject中传递的值过滤主对象。所以filterObject中的所有条件都应该匹配。应返回所有匹配的ID。这可以通过“每一个”来完成。您可以对对象进行筛选,然后将其排除。我已经注释掉了部分比较,因为不清楚是否要对这些属性进行过滤,以及如何过滤。你只提到了地点。如果希望它包含所有属性的所有匹配结果,请将
&&
更改为| |
如前所述,如果属性匹配(或具有一致的命名),代码可以简化和通用化
filterObject
根据存在的任何匹配项进行筛选。过滤器对象1
要求在垂直部分中存在所有元素,并且在其他属性中存在任何匹配项
testObject=[{
“id”:1892928,
“垂直税”:[
678,
664
],
“地点税”:[
666
],
“圆形”:[
“rt1”
],
},
{
“id”:1892927,
“垂直税”:[
662,
663
],
“地点税”:[
663
],
“圆形”:[
“rt2”
],
}]
过滤器对象={
地点:[66666 7],
圆形类型:[“rt1”、“rt2”],
垂直方向:[662661]
};
常量filterObject=(filterObject,testObject)=>{
返回testObject.filter(obj=>
obj.location\u tax&&obj.location\u tax.some(
x=>filterObject.locations&&filterObject.locations.includes(x))||
obj.roundType&&obj.roundType.some(
x=>filterObject.roundTypes&&filterObject.roundTypes.includes(x))||
obj.垂直税和obj.垂直税(
x=>filterObject.verticals&&filterObject.verticals.includes(x))
);
};
log(filterObject(filterObject,testObject));
过滤器对象={
圆形类型:[“rt1”、“rt2”],
垂直方向:[662661]
};
log(filterObject(filterObject,testObject));
//要求使用.every在filterObject.verticals中显示所有对象
常量filterObject s1=(filterObject,testObject)=>{
返回testObject.filter(obj=>
(obj.location\u tax和&obj.location\u tax.some(
x=>filterObject.locations&&filterObject.locations.includes(x))||
obj.roundType&&obj.roundType.some(
x=>filterObject.roundTypes&&filterObject.roundTypes.includes(x))
) &&
filterObject.verticals.every(x=>obj.vertical\u tax&&obj.vertical\u tax.包括(x))
);
};
过滤器对象={
圆形类型:[“rt1”、“rt2”],
垂直方向:[662663]
};
删除testObject[0]。垂直税;
log(filterObject 1(filterObject,testObject))代码>如果您只想测试一个条件,只需使用该语句并放弃其余的条件,或者如果您想使任一条件为true以获得结果,则将必要语句的&&逻辑更改为| |
testObject.filter( i => {
return i.vertical_tax.every((value, index) => value === filterObject.verticals[index]) &&
i.location_tax.every((value, index) => value === filterObject.locations[index]) &&
i.roundType.every((value, index) => value === filterObject.roundTypes[index]);
});
你能重新组织这个问题吗?所以我需要用filterObject中传递的值过滤主对象。因此,如果filterobject有location:[66666 7],那么在主对象中,所有在其位置数组中包含666的ID都应该返回。这将更简单的是匹配的属性。对于所有三个属性,如位置、垂直和圆形,都是这样。还有一个问题,如果属性之一没有值filterObject={locations:[66666 7],roundTypes:[],verticals:[662661]},该怎么办;包含或,或者它们需要匹配所有属性?对于没有值的属性,将需要添加一个检查以确保该属性已定义,或者取决于您希望它的行为方式。如果它为null或未定义,您希望它根本不过滤它,或者什么?需要至少匹配一个属性。。。。如何添加该检查,因为获取未定义的错误我已经更新了代码,您将看到我为每个filterObject属性添加了一个检查。我没有为testObject添加检查,但它也一样,好吧,还有一个问题,如果结果需要662和663才能出现,该怎么办。基本上,所有的属性都需要匹配,这适用于所有三个属性,如位置、垂直和圆形。还有一个问题,如果属性之一没有值filterObject={locations:[66666 7],roundTypes:[],verticals:[662661]},该怎么办;比较语句将跳过这一步,因为没有可比较的内容,如果缺少值,则不会有任何错误