У меня есть группа фильтрации 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:[]}
тогда мы должны проверить оба подключенных: ложных и подключенных: истинно совпадают данные в основном массиве (если данные подключены: истинно в основном массиве, то он будет отображаться, а также если данные подключены: ложно будет отображаться)
для этого типа фильтра
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,
}
];
, потому что вы можете видеть в фильтре подключено: true и подключено: false и deviceLocation с def и ab c, а также devicePaymentMethods - ab
это означает, что я хочу, чтобы все устройства были подключены к true и подключены к false с местоположением ab c и def и paymetmethod ab