Je recherche une méthode utilisant lodash / underscore (ou plain JS s'il n'en existe pas) qui me permettra uniquement de prendre un objet donné tel que ci-dessous.

animals: {
  {
    type: 'duck',
    name: 'quack',
  },
  {
    type: 'duck',
    name: 'quieck',
  },
  {
    type: 'dog',
    name: 'bark',
  },
},

Cet objet contient par exemple 3 animaux différents, mais deux d'entre eux sont du même type.

Le résultat final est de pouvoir utiliser une structure de contrôle telle qu'une boucle for pour parcourir chaque TYPE d'animal, de sorte que je travaille avec quelque chose qui n'a qu'une seule instance de chaque type.

Ceci est utilisé parce que je crée une liste.

Cette liste sera similaire à la suivante

duck
 name is quack
 name is quick
dog
 name is bark

Mais je veux le faire avec des structures de contrôle et non pas simplement en sortant et en codant en dur dans chaque nom, car cette liste deviendra très longue et longue.

0
Andrew Mata 8 mars 2016 à 20:24

3 réponses

Meilleure réponse

J'utiliserais la fonction uniq.

var uniqueAnimals = _.uniq(animals, function(item, key, type) { 
    return item.type;
});
1
Michael Oakley 8 mars 2016 à 17:32

_.groupBy () peut-être?

var animals = [
  {
    type: 'duck',
    name: 'quack',
  },
  {
    type: 'duck',
    name: 'quieck',
  },
  {
    type: 'dog',
    name: 'bark',
  },
];
  
var grouped = _.groupBy(animals, 'type');

document.write('<pre>' + JSON.stringify(grouped, null, 3) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.min.js"></script>
0
Shanoor 8 mars 2016 à 17:56

Présumer animals n'est pas une erreur de syntaxe, mais un tableau: si vous ne voulez pas seulement filtrer les types uniques mais aussi créer une structure pour votre sortie, vous pouvez aller avec un objet:

var kv = {};
animals.forEach(function(a) {
    if(kv[a.type]) {
        kv[a.type].push(a.name);
    } else {
        kv[a.type] = [];
    } 
}

Plus tard, vous pouvez parcourir Object.keys(kv) pour imprimer vos clés / valeurs

0
Johannes Jander 8 mars 2016 à 17:35