JavaScript: Как фильтровать массив по значениям, вложенным в объект на уровне 2 - PullRequest
1 голос
/ 04 августа 2020

У меня есть массив объектов.

Внутри каждого объекта массива может быть несколько объектов типа «Книга», все с ключами динамического 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},
  },
]

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

Ожидаемый фильтрованный массив

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

Я пробовал использовать filter и map, но дошел до точки, когда мне нужно пройти l oop и проверить, какая книга new, и я не уверен, как вернуть этот объект в фильтр.

Ответы [ 4 ]

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

Похоже, вы хотите что-то вроде этого:

arr.filter((o) => Object.values(o).some((b) => b.isNew))

Будет ли ваш массив когда-либо иметь только ключи id и bookwxyz? Если нет, вам может потребоваться выполнить некоторую проверку значений, чтобы убедиться, что они не являются неопределенными

Вы также можете явно проверить ключ, используя Object.entries и регулярное выражение:

arr.filter((o) => Object.entries(o).some(([key, value]) => /book\d{4}/.test(key) && value.isNew))

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

Вы можете использовать Array#some с Object.values.

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}, }, ];
const res = arr.filter(obj=>Object.values(obj).some(({isNew})=>isNew));
console.log(res);
1 голос
/ 04 августа 2020

const arr=[{id:"123",book1242:{isNew:!0},book9023:{isNew:!1}},{id:"123",book0374:{isNew:!1},book9423:{isNew:!1}},{id:"123",book8423:{isNew:!1},book9023:{isNew:!1}},{id:"123",book6534:{isNew:!0},book9313:{isNew:!1}}];

const res = arr.filter(obj => {
  for(const [key, val] of Object.entries(obj)){
    if(key.substring(0,4) === 'book' && val.isNew === true){
      return obj
    }
   }
})

console.log(res)
0 голосов
/ 04 августа 2020
 let sorted =[]
  arr.forEach((el, i) => {
         let obj_values = Object.values(el);
         obj_values = obj_values.filter((elem) => typeof elem == 'object' && elem.isNew == true);
if(obj_values.length) sorted.push(arr[i])
     })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...