1
votes

Filtrer le tableau d'objets en fonction d'un champ dans chaque objet

Disons que j'ai un tableau d'objets comme celui-ci:

[
  { "type": 121, "model": "model1" }
]

[
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

Et je veux le filtrer et créer de nouveaux objets basés sur le champ modèle .

/ p>

Le résultat final étant:

[
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

J'utilise du tapuscript et du lodash, donc tout ce qui est avec ça serait mieux

J'ai essayé mappage lodash groupBy et ES6, mais sans succès jusqu'à présent. Je suppose que je pourrais le faire de manière sale avec plusieurs boucles forEach mais je suis presque sûr qu'il existe un moyen beaucoup plus simple.


1 commentaires

pouvez-vous indiquer votre code ou https://stackblitz.com/ ?


6 Réponses :


2
votes

Vous pouvez utiliser .filter , comme ceci:

let newarray1 = array.filter(obj => obj.model === 'model1');
let newarray2 = array.filter(obj => obj.model === 'model2');
...


0 commentaires

1
votes

Vous pouvez simplement utiliser la fonction Array.filter pour filtrer le tableau vers un nouvel objet tableau. Ici, j'utilise la variable searchModels qui aura la liste des modèles que vous voulez filtrer et le filtre intérieur Je vérifie la condition searchModels.indexOf (item.model) pour vérifier la valeur du modèle .

var array = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
];


var searchModels = ['model1', 'model3'];
var filteredArray = array.filter((item) => { return searchModels.indexOf(item.model) !== -1 });
console.log("Original: " , array);
console.log("Filtered: " , filteredArray);


0 commentaires

1
votes

Vous pourriez donc quelque chose comme ça par exemple :) Dans ce cas, je crée une carte, je pense que c'est plus facile pour la recherche

newData = ([
    [ "model1", "130" ],
    [ "model1", "128" ],
    [ "model2", "3" ]
]);

Vous obtiendrez quelque chose comme:

var newData = new Map([]);

var originalData = [{"type": 130, "model": "model1"}, {"type": 130, "model": "model2"}];
var formattedData = originalData.map(obj => { 
  newData[obj.model].push(obj.type); 
});

Et vous pouvez obtenir toutes les valeurs en utilisant la clé de modèle newData ["model2"] = ["3"]


0 commentaires

0
votes

Voir, si cette aide avec lodash

<script src='https://cdn.jsdelivr.net/lodash/4.17.2/lodash.min.js'></script>
var data = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
];

var grouped = _.groupBy(data, function(item) {
  return item.model;
});

console.log(grouped);


0 commentaires

1
votes

vous pouvez utiliser la méthode Array.prototype.reduce pour tout regrouper.

let array = [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 130, "model": "model2" }
]

let all = [...array.reduce((acc, curr) => {
  acc.has(curr.model) ? acc.set(curr.model, [...acc.get(curr.model), curr]): acc.set(curr.model, [curr]);
  return acc;
}, new Map()).values()];
console.log(...all)


0 commentaires

1
votes

essayez ceci @raulicious,

var arrayList= [
  { "type": 121, "model": "model1" },
  { "type": 128, "model": "model2" },
  { "type": 130, "model": "model2" },
  { "type": 131, "model": "model2" }
];


   var filteredArray = [];
   var filtered = [];
   
   arrayList.sort((a, b) => {
         if(a.model == b.model) {
             filtered.push(b);
         } else {
             filtered.push(b);
             filteredArray.push(filtered);
             filtered = [];
           }
       filtered.push(a);
       filteredArray.push(filtered);
     });
    console.log(filteredArray);

Je sais que cela a un code redondant, j'essaye de le réduire bientôt


0 commentaires