Как отфильтровать массив объектов (с массивами внутри) с другим массивом объектов - PullRequest
0 голосов
/ 29 января 2020

У меня есть два массива:

filters:
        {
            location: ['Swiss cottage','Fulham'],
            age: ['Giga'],
        }

и

data: 
[
  {
    "location": "Swiss cottage",
    "ages": "Giga",
  },
  {
    "location": "Fulham",
    "ages": "Kilo",
  },
  {
    "location": "Putney",
    "ages": "Micro",
  }
]

Я хочу использовать первый для фильтрации второго, как мне это сделать?

Ответы [ 4 ]

0 голосов
/ 29 января 2020

Все просто, массивы в объекте "filters" должны содержать соответствующие значения.

let filteredData = data.filter((x) => 
        filters.location.includes(x.location) && 
        filters.age.includes(x.ages));
0 голосов
/ 29 января 2020

Вы можете получить записи filters для наличия итеративного набора данных и фильтрации data, проверив каждый ключ записей со значением.

В результате вы получите только объект, который соответствует все свойства filter.

Для этого подхода требуются одинаковые имена свойств для filter и data.

И подхода с Array#every

Все искомые свойства должны совпадать.

var filters = { location: ['Swiss cottage', 'Fulham'], ages: ['Giga'] },
    data = [{ location: "Swiss cottage", ages: "Giga" }, { location: "Fulham", ages: "Kilo" }, { location: "Putney", ages: "Micro" }],
    entries = Object.entries(filters),
    result = data.filter(o => entries.every(([k, v]) => v.includes(o[k])));

console.log(result);

ИЛИ подход с Array#some

Одно искомое свойство должно совпадать.

var filters = { location: ['Swiss cottage', 'Fulham'], ages: ['Giga'] },
    data = [{ location: "Swiss cottage", ages: "Giga" }, { location: "Fulham", ages: "Kilo" }, { location: "Putney", ages: "Micro" }],
    entries = Object.entries(filters),
    result = data.filter(o => entries.some(([k, v]) => v.includes(o[k])));

console.log(result);
0 голосов
/ 29 января 2020

const filters = {
    location: ['Swiss cottage','Fulham'],
    age: ['Giga'],
};

const data = [
  {
    "location": "Swiss cottage",
    "ages": "Giga",
  },
  {
    "location": "Fulham",
    "ages": "Kilo",
  },
  {
    "location": "Putney",
    "ages": "Micro",
  }
];

const output = data.filter(item => {
   return filters.location.indexOf(item.location) > -1 && filters.age.indexOf(item.ages) > -1;
});

console.log(output)
0 голосов
/ 29 января 2020

Вы можете сделать что-то вроде этого. Если это один из фильтров, измените && на ||.

let filters = {
    location: ['Swiss cottage','Fulham'],
    age: ['Giga'],
}

let data= [
  {
    "location": "Swiss cottage",
    "ages": "Giga",
  },
  {
    "location": "Fulham",
    "ages": "Kilo",
  },
  {
    "location": "Putney",
    "ages": "Micro",
  }
]

let x = data.filter(d => {
  if (filters.location.includes(d.location) && filters.age.includes(d.ages))
    return d;
});
 
console.log(x); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...