У меня есть массив объектов, который мне нужно отфильтровать от другого объекта, содержащего те же ключи, где значения являются массивами. Мне нужно, чтобы это рассматривалось ИЛИ в одном и том же массиве фильтров, но если это разные фильтры, это должно рассматриваться как И.
Размер объектов переменный, он может содержать от 2 до 30 элементов, поэтому мы не можем явно указать ключи.
Бывший:
#data
[
{a:'1',b:'2'},
{a:'3',b:'4'},
{a:'5',b:'6'}
]
#filter 1
{a:['1','3']}
#result 1
[
{a:'1',b:'2'},
{a:'3',b:'4'},
]
#filter 2
{a:['1','3'],b:['2']}
#result 2
[
{a:'1',b:'2'}
]
Я попробовал использовать этот код, но результат оказался не таким, как я ожидал, он все вернул с помощью OR.
return this.data.filter(
(objData:any) => {
return Object.keys(currDataRow).some(
(keyDataRow:any) => {
if (typeof(objFilter[keyDataRow])!=='undefined') {
return objFilter[keyDataRow].includes(currDataRow[keyDataRow])
}
return false;
}
)
}
)
Затем я попробовал другой результат, он улучшился, но это все еще не ожидаемый результат, потому что выбор двух одинаковых фильтров не дал правильного результата.
return this.data.filter(
(objData:any) => {
let result = 0;
let countFilter = 0;
Object.keys(currDataRow).some(
(keyDataRow:any) => {
if (typeof(objFilter[keyDataRow])!=='undefined') {
countFilter += objFilter[keyDataRow].length
result += objFilter[keyDataRow].includes(currDataRow[keyDataRow]) ? 1 : 0;
}
}
)
return result == countFilter;
}
)
Будет проще, если вы переберете пары ключ/значение фильтра и потребуете, чтобы каждая пара из них соответствовала текущему объекту:
const applyFilter = (data, filter) => data.filter(obj =>
Object.entries(filter).every(([key, values]) =>
values.includes(obj[key])
)
);
// Example run
const data = [
{ a: '1', b: '2' },
{ a: '3', b: '4' },
{ a: '5', b: '6' }
];
const filter2 = { a: ['1', '3'], b: ['2'] };
const result = applyFilter(data, filter2);
console.info(result);