Tengo problemas para intentar filtrar una serie de objetos de mensaje. No quiero incluir los objetos con valor "_id" "receptor" o "usuarios bloqueados".
Matriz de objetos de mensaje:
[ {"_id":"receiver"}, {"_id":"blockedUsers"}, {"_id": MjIzx3XA1mpcuzgDVZj","createdAt":1631349363111,"text":"Ok","user":{"name":"Nikki","_id":"M6fBsPludfYVjJXKYvwgxHRacYw1"}}, {"_id":" MjG3hFAgcNweJWh9SF7","createdAt":1631300277391,"text":"Again","user":{"name":"Chris","_id":"tFhmw5oQoPhk8nF2sx5rE5BFqw93"} } ]Lo siguiente no parece funcionar
this.state.messages.filter(msg => !msg._id.includes("receiver") || !msg._id.includes("blockedUsers")).Se devuelve la matriz original.
Pero si uso esto
this.state.messages.filter(msg => msg._id.includes("receiver") || msg._id.includes("blockedUsers"))vuelve:
[{"_id":"receiver"},{"_id":"blockedUsers"}]¿Puedes ayudarme?
La condición del filtro es incorrecta, siempre devolverá verdadero en su caso.
La devolución de llamada de Array.filter() debe devolver true para los elementos que desea conservar.
Tienes que usar AND && en lugar de OR || .
this.state.messages.filter(msg => !msg._id.includes("receiver") && !msg._id.includes("blockedUsers") )¿Por qué inicialmente devolvió verdadero? Porque cuando la identificación es "receptor", no incluye "usuarios bloqueados" y viceversa. Desea conservar el elemento si no incluye "receptor" Y tampoco incluye "usuarios bloqueados".
Aquí hay una tabla de verdad para que quede más claro, debería ser true para los elementos que desea conservar.
| !incluye("receptor") | !incluye("Usuariosbloqueados") | O | Y |
|---|---|---|---|
| falso | falso | falso ✅ | falso ✅(omitir elemento, incluye ambas cadenas) |
| falso | verdadero | cierto ❌ | falso ✅(omitir elemento, incluye "usuarios bloqueados") |
| verdadero | falso | cierto ❌ | falso ✅(omitir elemento, incluye "receptor") |
| verdadero | verdadero | cierto ❌ | verdadero ✅(este es el único caso en el que desea mantener el elemento, cuando no incluye ninguna cadena) |
Puede combinar Array.prototype.filter() con Array.prototype.includes() :
const arr = [{ _id: 'receiver' },{ _id: 'blockedUsers' },{ _id: 'MjIzx3XA1mpcuzgDVZj', createdAt: 1631349363111, text: 'Ok', user: { name: 'Nikki' } },{ _id: 'M6fBsPludfYVjJXKYvwgxHRacYw1' },{ _id: ' MjG3hFAgcNweJWh9SF7', createdAt: 1631300277391, text: 'Again', user: { name: 'Chris', _id: 'tFhmw5oQoPhk8nF2sx5rE5BFqw93' }}] const result = arr.filter(({ _id }) => !['receiver', 'blockedUsers'].includes(_id)) console.log(result)