Come creare una funzione multi-filtro per filtrare più attributi utilizzando JS?

Aug 21 2020

Matrice di oggetti da filtrare

[
  {
    "name": "Apple",
    "age": 24,
    "model": "Android",
    "status": "Under development",
  },

  {
    "name": "Roboto",
    "age": 24,
    "model": "Apple",
    "status": "Running",
  },
  
  .
  .
  .
  .
 
]  

Ho bisogno di filtrare l'array utilizzando più parametri utilizzando il metodo di filtro JS. Ho una soluzione parziale e non sono riuscito a ottenere l'output previsto (bloccato su di esso).

Qui, il filtro dovrebbe funzionare anche con più valori per un singolo attributo. Ad esempio, età = 54,23 o modello = Android, Apple ecc.

Detto semplicemente, sto cercando di imitare il funzionamento dei filtri proprio come quello di un sito di e-commerce in cui possiamo confrontare tutti gli attributi di un prodotto e i tag scelti dal cliente per produrre un elenco filtrato di prodotti.

Qualsiasi aiuto è apprezzabile. Grazie!

Risposte

3 trincot Aug 21 2020 at 10:49

Se formatti le condizioni di filtro proprio come un oggetto nella tua matrice di dati, ma con i valori che sono matrici di valori possibili, puoi utilizzare il filtermetodo come segue:

let data = [
  {
    "name": "Apple",
    "age": 24,
    "model": "Android",
    "status": "Under development",
  }, {
    "name": "Roboto",
    "age": 24,
    "model": "Apple",
    "status": "Running",
  }, {
    "name": "Samsung",
    "age": 26,
    "model": "Blueberry",
    "status": "Running",
  },
];

let filter = {
    "name": ["Roboto", "Ericsson"],
    "age": [22, 24, 26],
};

let res = data.filter(obj =>
    Object.entries(filter).every(([prop, find]) => find.includes(obj[prop])));
    
console.log(res);