Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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_Reactjs_Filter - Fatal编程技术网

Javascript 如何使用对象数组筛选数组对象

Javascript 如何使用对象数组筛选数组对象,javascript,reactjs,filter,Javascript,Reactjs,Filter,我有一个过滤组js对象,如下所示: let filter = { generalFilter:[ {key: "connected", value: true}, {key: "connected", value: false} ], locationFilter:[ {key: "deviceLocation", value: "def"}, {key: "deviceLocation", value: "abc"} ], paymentMethodsFil

我有一个过滤组js对象,如下所示:

 let filter = {
generalFilter:[
    {key: "connected", value: true},
    {key: "connected", value: false}
],
locationFilter:[
    {key: "deviceLocation", value: "def"},
     {key: "deviceLocation", value: "abc"}
],
paymentMethodsFilter:[
    {key: "devicePaymentMethods", value: "ab"}
]

}
主阵列如下所示:

const devices = [{
    deviceLocation: {
      label: "abc",
      value: "abc"
    },
    deviceName: "test7",
    devicePaymentMethods: [{
      label: "ab",
      value: "ab"
    }, {
      label: "cd",
      value: "cd"
    }, {
      label: "ef",
      value: "ef"
    }],
    deviceType: "iPad",
    id: "001",
    connected: true,
    enabled: true,
  },
  {
    deviceLocation: {
      label: "def",
      value: "def"
    },
    deviceName: "test4",
    devicePaymentMethods: [{
      label: "ab",
      value: "ab"
    }, {
      label: "cd",
      value: "cd"
    }],
    deviceType: "iPad",
    id: "004",
    connected: false,
    enabled: false,
  }
];
如何使用筛选器对象筛选此设备阵列? 这是我试过的,但不起作用

devices.filter((device) => {
    let shouldKeep = new Array(3)
    shouldKeep.fill(0) //fills the array with 0, meaning no filter groups has passed yet
    for(let filterGroupIndex in filter) {// Loop through each filter group in filter
        let filterGroup = filter[filterGroupIndex]
        for(let filterObject in filterGroup) { //Loop through
            if(filterGroup[filterObject].key in device && device[filterGroup[filterObject].key] === filterGroup[filterObject].value) {
                shouldKeep[filterGroupIndex] = 1 //Set current filterGroup to 1, meaning it has passed the filter
                break; // At least one value in that filter group is true, skip to next filter group
            }
        }
    }

    if(shouldKeep.reduce((a,b) => a + b, 0) >= filter.length) {
        return true;
    }
    return false
})
有时,当此筛选器对象为空时,它可能为空。它应该返回完整数组,而不返回筛选器主数组。最好的方法是什么?我不确定,也许还有其他解决办法。请帮帮我

默认的过滤器对象如下所示

let filter = {
    generalFilter:[],
    locationFilter:[],
    paymentMethodsFilter:[]

    }
用户可以将一个对象添加到我正在使用的过滤器数组中 比如说

 let filter = {
generalFilter:[
    {key: "connected", value: true},
    {key: "connected", value: false}
],
locationFilter:[],
        paymentMethodsFilter:[]}
然后,我们必须检查主数组中的connected:false和connected:true匹配数据(如果主数组中的数据已连接:true,则它将显示;如果数据已连接:false,则它将显示)

对于这种类型的过滤器

let filter = {
generalFilter:[
    {key: "connected", value: true},
    {key: "connected", value: false}
],
locationFilter:[
    {key: "deviceLocation", value: "def"},
     {key: "deviceLocation", value: "abc"}
],
paymentMethodsFilter:[
    {key: "devicePaymentMethods", value: "ab"}
]

}
结果应该是

result =[{
    deviceLocation: {
      label: "abc",
      value: "abc"
    },
    deviceName: "test7",
    devicePaymentMethods: [{
      label: "ab",
      value: "ab"
    }, {
      label: "cd",
      value: "cd"
    }, {
      label: "ef",
      value: "ef"
    }],
    deviceType: "iPad",
    id: "001",
    connected: true,
    enabled: true,
  },
  {
    deviceLocation: {
      label: "def",
      value: "def"
    },
    deviceName: "test4",
    devicePaymentMethods: [{
      label: "ab",
      value: "ab"
    }, {
      label: "cd",
      value: "cd"
    }],
    deviceType: "iPad",
    id: "004",
    connected: false,
    enabled: false,
  }
];
因为你可以在filter connected:true和connected:false和deviceLocation中看到def和abc以及devicePaymentMethods是ab


这意味着我希望所有设备都具有连接正确和连接错误的位置abc和def以及paymetmethod ab

你能解释更多你想做的事情吗。从你的问题来看很不清楚

通常,如果您想按设备位置进行过滤,您会这样做

devices.filter(device=>device.deviceLocation.label==="abc")

我希望这个例子能帮助你解决剩下的问题

查看注释以获取解释

const过滤器={
通用过滤器:[
{key:“connected”,value:true},
{键:“已连接”,值:false}
],
位置过滤器:[
{键:“deviceLocation”,值:“def”},
{键:“deviceLocation”,值:“abc”}
],
付款方式过滤器:[
{键:“devicePaymentMethods”,值:“ab”}
]
};
const parsedFilter={};
/**
将筛选器转换为哈希映射,其中筛选器作为键,值作为
可能值的数组。
parsedFilter看起来像这样
{“已连接”:[true,false],“deviceLocation”:[“def”,“abc”],“paymentOption”:[“ab”]}
现在,我们可以轻松地检查过滤器中是否存在任何值。
**/
const filterKeys=Object.keys(过滤器);
filterKey.forEach((filterKey)=>{
if(Array.isArray(filter[filterKey])){
筛选器[filterKey].forEach((filterItem)=>{
if(Object.prototype.hasOwnProperty.call(parsedFilter,filterItem.key)){
parsedFilter[filterItem.key].push(filterItem.value);
}否则{
parsedFilter[filterItem.key]=[filterItem.value];
}
});
}
});
常数设备=[
{
设备位置:{
标签:“abc”,
价值:“abc”
},
deviceName:“test7”,
设备付款方式:[
{
标签:“ab”,
值:“ab”
}, {
标签:“cd”,
值:“cd”
}, {
标签:“ef”,
值:“ef”
}],
设备类型:“iPad”,
id:“001”,
是的,
启用:对,
}
];
常量结果=[];
/**
通过每个设备循环,并检查密钥是否存在于
parsedFilter。
如果为true:检查该设备密钥的值类型。
if对象:然后检查它是否存在于
在parsedFilter中指定deviceKey。
if数组:然后循环遍历每个项并检查它是否存在
在给定deviceKey的parsedFilter中
如果数字、字符串、布尔值:检查
给定deviceKey的parsedFilter
如果为false:只需将其添加到结果中。
**/
if(数组.isArray(设备)){
devices.forEach((设备)=>{
常量键=对象键(设备);
const resultDeviceObj={};
key.forEach((key)=>{
if(Object.prototype.hasOwnProperty.call(parsedFilter,key)){
if(设备[key]的类型==“对象”&&parsedFilter[key]。包括(设备[key]。值)){
结果设备bj[key]=设备[key];
}else if(Array.isArray(设备[key])){
常数arrayResult=[];
设备[键].forEach((项)=>{
if(parsedFilter[key].includes(item.value)){
arrayResult.push(项目);
}
});
结果eviceobj[key]=arrayResult;
}else if(parsedFilter[key]。包括(设备[key])){
结果设备bj[key]=设备[key];
}
}否则{
结果设备bj[key]=设备[key];
}
});
result.push(resultDeviceObj);
});
}

console.log(“结果”,result)如果我使用此devices.filter(device=>device.deviceLocation.label==“abc”),我希望获得与筛选器对象中所有条件匹配的数据。它只检查一个conditionconst filtered\u values=devices.filter(device=>{return device.connected==filter.generalFilter[0].value | | device.connected==filter.generalFilter[1]。value&&device.deviceLocation.value==filter.locationFilter[0]。value | | device.deviceLocation.value==filter.locationFilter[1]。value&&device.devicePaymentMethods.value==filter.paymentMethodsFilter[0]。value})
paymentOption
在过滤器中键入指向设备对象中的
devicePaymentMethods
?对于其余部分,有1:1映射,但不适用于paymentOption我添加了更多详细信息,很抱歉paymentOption我更改了它。我检查了你的代码,即使我将filter对象更改为这个常量filter={generalFilter:[{key:“connected”,value:false}],locationFilter:[],paymentMethodsFilter:[]};它返回相同的数据结果应为空,因为没有包含con的数据