JavaScript: Как отфильтровать массив вложенных объектов? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть такой массив

const arr = [
  {
    id: '123',
    book: {isNew: true}
  },
  {
    id: '123',
    book: {isNew: false}
  },
  {
    id: '123',
    book: {isNew: false}
  },
  {
    id: '123',
    book: {isNew: true}
  },
]

Я пытаюсь отфильтровать массив, чтобы вернуть только те объекты, для которых объект книги имеет значение isNew как истинное.

Я пытался что-то вот так

arr.filter(obj => {
  // Use a forEach to determine which book obj is new
}

Однако forEach не может возвращать никаких значений.

EDIT

Похоже, мой первоначальный способ объяснения был немного отсутствует.

В каждом объекте массива может быть несколько объектов типа «Книга». Все с ключами Dynami c. Я хочу, чтобы объект имел хотя бы один новый объект «Книга».

Например:

const arr = [
  {
    id: '123',
    book1242: {isNew: true},
    book9023: {isNew: false},
  },
  {
    id: '123',
    book0374: {isNew: false},
    book9423: {isNew: false},
  },
  {
    id: '123',
    book8423: {isNew: false},
    book9023: {isNew: false},
  },
  {
    id: '123',
    book6534: {isNew: true},
    book9313: {isNew: false},
  },
]

Итак, мой фильтрованный массив будет состоять из первого и последнего элементов исходного массива.

1 Ответ

1 голос
/ 04 августа 2020

Как насчет этого?

arr.filter(({ book: { isNew } }) => isNew)

Я просто использую структуру данных, чтобы получить свойство isNew и вернуть только ИСТИННОЕ значение

ОБНОВЛЕНИЕ:

({book: {isNew}}) это просто еще один способ написать

arr.filter((object) => object.book.isNew)

UPDATE:

Вопрос был о динамике c [ключ] Я пришел с 2 решениями 1 -

arr.filter((item) => {
  for (const key of Object.keys(item)) {
    const { isNew } = item[key]
    if (typeof isNew === 'boolean') return isNew
  }
})

Где я фильтрую и зацикливаю для каждого ключа и проверяю, есть ли свойство с ключом [isNew] если есть верну

Другой способ написать

arr.filter((item) => {
  for (const key of Object.keys(item))
    if (item[key].hasOwnProperty('isNew')) return item[key].isNew
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...