Как отфильтровать объекты?
let databasesData = [
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Ivanov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Ivanov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Petrov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "1322", house: "133", lastName: "Sidorov" }
];
let searchObj = { firstName: "Ivan", lastName: "Ivanov" };
Как из databasesData извлечь только те объекты, которые содержат пару ключ-значение такие же, как в объекте searchObj?
P.S. Поля в searchObj не конкретные, а могут быть разными, например вместо firstName может быть city или flat, и.т.д..
Ответы (3 шт):
Автор решения: Pilaton
→ Ссылка
let databasesData = [{
birthday: '19.06.1999',
city: 'New-York',
firstName: 'Ivan',
flat: '13',
house: '11',
lastName: 'Ivanov'
},
{
birthday: '19.06.1999',
city: 'New-York',
firstName: 'Ivan',
flat: '13',
house: '11',
lastName: 'Ivanov'
},
{
birthday: '19.06.1999',
city: 'New-York',
firstName: 'Ivan',
flat: '13',
house: '11',
lastName: 'Petrov'
},
{
birthday: '19.06.1999',
city: 'New-York',
firstName: 'Ivan',
flat: '1322',
house: '133',
lastName: 'Sidorov'
},
];
let searchObj = {
firstName: 'Ivan',
lastName: 'Ivanov'
};
let res = databasesData.filter((a) => a.firstName === searchObj.firstName && a.lastName === searchObj.lastName);
console.log('res', res);
Автор решения: nörbörnën
→ Ссылка
const databasesData = [
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Ivanov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Ivanov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "13", house: "11", lastName: "Petrov" },
{ birthday: "19.06.1999", city: "New-York", firstName: "Ivan", flat: "1322", house: "133", lastName: "Sidorov" }
];
console.log(
search(databasesData, {house: "11", lastName: "Petrov"})
);
console.log(
search(databasesData, {house: "11"})
);
console.log(
search(databasesData, {house: "12"})
);
function search(items, conditions) {
return items.filter(
(item) => Object.keys(conditions).every((k) => conditions[k] === item[k])
);
}
Автор решения: Grundy
→ Ссылка
Для фильтрации нужно воспользоваться методом .filter. Далее необходимо обойти все свойства объекта searchObj и сравнить со значениями в текущем проверяемом объекте.
Обход можно сделать, например, с помощью цикла for..in
В итоге код может выглядеть так:
let databasesData = [{
birthday: "19.06.1999",
city: "New-York",
firstName: "Ivan",
flat: "13",
house: "11",
lastName: "Ivanov"
},
{
birthday: "19.06.1999",
city: "New-York",
firstName: "Ivan",
flat: "13",
house: "11",
lastName: "Ivanov"
},
{
birthday: "19.06.1999",
city: "New-York",
firstName: "Ivan",
flat: "13",
house: "11",
lastName: "Petrov"
},
{
birthday: "19.06.1999",
city: "New-York",
firstName: "Ivan",
flat: "1322",
house: "133",
lastName: "Sidorov"
}
];
let searchObj = {
firstName: "Ivan",
lastName: "Ivanov"
};
console.log(
databasesData.filter(o => {
for (var prop in searchObj) {
if (searchObj[prop] !== o[prop]) return false;
}
return true;
})
)