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.
6 Réponses :
Vous pouvez utiliser .filter
, comme ceci:
let newarray1 = array.filter(obj => obj.model === 'model1'); let newarray2 = array.filter(obj => obj.model === 'model2'); ...
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);
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"]
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);
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)
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
pouvez-vous indiquer votre
code
ouhttps://stackblitz.com/
?