Javascript 如何使用对象数组筛选数组对象
我有一个过滤组js对象,如下所示: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
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的数据