Как отфильтровать объекты?

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;
  })
)

→ Ссылка