Фильтровать массив объектов с разными атрибутами

#javascript

#javascript

Вопрос:

У меня есть массив объектов, которые я хочу отфильтровать, чтобы в нем отображались только объекты с идентификатором, по крайней мере, с «чем-то», что не является пустым в нем, кроме идентификатора. итак, этот массив ниже

 [{id:1, a:true, b:[]},
 {id:2, a:false, b:[]},
 {id:3, foo:'', bar:{}},
 {id:4, bla:[1,2,3], blabla:{x: 1}}];
 

показать дает мне следующий результат:

 [{id:1, a:true, b:[]},
 {id:4, bla:[1,2,3], blabla:{x: 1}}];
 

Вот где я нахожусь, однако я знаю, что этот способ не идеален, даже если он дает мне вышеуказанный результат :

 const  dataArray = [
        {id:1, a:true, b:[]},
        {id:2, a:false, b:[]},
        {id:3, foo:'', bar:{}},
        {id:4, bla:[1,2,3], blabla:{x: 1}}
];

const filterArray = dataArray.filter((value) => {
        return value.foo != '' amp;amp; value.a != false
})

console.log(filterArray);
 

https://jsfiddle.net/cnuvkg54/

Комментарии:

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

2. Пожалуйста, более четко определите «что -то», что не является пустым . Каков ожидаемый результат и почему?

Ответ №1:

Вы можете проверять объекты с помощью ключей.

 const 
    array = [{ id: 1, a: true, b: [] }, { id: 2, a: false, b: [] }, { id: 3, foo: '', bar: {} }, { id: 4, bla: [1, 2, 3], blabla: { x: 1 } }],
    result = array.filter(({ id, ...o }) => Object.values(o).some(v => v amp;amp; typeof v === 'object'
        ? Object.keys(v).length
        : v
    ));

console.log(result); 

Комментарии:

1. Спасибо за это, это то, чего я пытался достичь!

Ответ №2:

Если я правильно понимаю вашу цель, это может быть способом работы с неверными свойствами, отличными от id

 const dataArray = [
  { id: 1, a: true, b: [] },
  { id: 2, a: false, b: [] },
  { id: 3, foo: "", bar: {} },
  { id: 4, bla: [1, 2, 3], blabla: { x: 1 } },
  { id: 5 }, // should not be in filterArray
  { id: 6, a: false } // should not be filterArray
];

// with Object.keys
const filterArray = dataArray.filter(({ id, ...data }) =>
  Object.keys(data).some((key) => data[key])
);

// with Object.entries
const filterArray2 = dataArray.filter(({ id, ...data }) =>
  Object.entries(data).some(([, prop]) => prop)
);

console.log(filterArray);
console.log(filterArray2);
 

Комментарии:

1. извините, если раньше это было непонятно, но вы в основном поняли это спасибо за ответ, который помог мне найти решение,