У меня есть объект с двумя полями filter1 и filter2, имеющими значения в виде массива

let filter = {filter1:["mine","your"]: filter2:["C","D"]} // значения не фиксированы

Данные представлены в виде массива объектов

let data = [
{ id:1, filter1:["mine"], filter2:["E","C"]},
{ id:2, filter1:["mine"], filter2:["E","C","F"]},
{ id:3, filter1:["your"], filter2:["C"]},
{ id:3, filter1:["your"], filter2:["D","C"]},
{ id:5, filter1:["other"], filter2:["F"]},
...
]

Мне нужно отфильтровать те объекты, у которых есть одно из полей, присутствующих в определенном ключе например, если filter равно {filter1:["mine"]: filter2:["F","D"]}, он сначала будет искать любой элемент filter1 в filter1 объекта данных, а после этого искать любой элемент filter2, который присутствует в filter2 объекта данных, и возвращать объект если кто-нибудь из них найден

few example

Результат для {filter1:["mine"]: filter2:["F","D"]}

result = [
{ id:1, filter1:["mine"], filter2:["E","C"]}, //since filter1 "mine"
{ id:2, filter1:["mine"], filter2:["E","C","F"]}, //since filter1 "mine"
{ id:3, filter1:["your"], filter2:["D","C"]}, //since from "F" and "D" from filter2 "D" is present
{ id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present
]

Результат для {filter1:["your"]: filter2:["F","G"]}

result = [
{ id:2, filter1:["mine"], filter2:["E","C","F"]}, //since "F" from filter2 is present
{ id:3, filter1:["your"], filter2:["D","C"]}, //since filter1 is "your"
{ id:5, filter1:["other"], filter2:["F"]}, //since "F" from filter2 is present
]

Результат для {filter1:[]: filter2:["D"]}

result = [
{ id:3, filter1:["your"], filter2:["D","C"]}, //since filter2 has "D"
]
1
Mohammad Zubair 25 Окт 2021 в 00:52
Вы можете использовать Array.prototype.filter ().
 – 
Danilo Ivanovic
25 Окт 2021 в 00:59

2 ответа

Лучший ответ

Вы можете использовать комбинацию .filter(), .some() и .includes():

const data = [
  { id:1, filter1:["mine"], filter2:["E","C"]},
  { id:2, filter1:["mine"], filter2:["E","C","F"]},
  { id:3, filter1:["your"], filter2:["C"]},
  { id:3, filter1:["your"], filter2:["D","C"]},
  { id:5, filter1:["other"], filter2:["F"]}
];

const search = ({ filter1, filter2 }) => 
  data.filter(item => 
    item.filter1.some(fItem => filter1.includes(fItem)) ||
    item.filter2.some(fItem => filter2.includes(fItem))
);

const result = search({ filter1:["mine"], filter2:["F","D"] });
console.log(result);
1
Ro Milton 25 Окт 2021 в 06:08
Если filter1 не в виде массива, подобного этому const data = [{id: 1, filter1: "mine", filter2: ["E", "C"]}, {id: 2, filter1: "mine" , filter2: ["E", "C", "F"]},]; тогда использование some вызовет ошибку, как справиться с этим
 – 
Mohammad Zubair
25 Окт 2021 в 10:19