web-dev-qa-db-fra.com

Recherche d'éléments dans un tableau JSON à l'aide d'un noeud (de préférence sans itération)

Actuellement, je reçois une réponse JSON comme celle-ci ...

{items:[
  {itemId:1,isRight:0},
  {itemId:2,isRight:1},
  {itemId:3,isRight:0}
]}

Je veux effectuer quelque chose comme ça (pseudo code)

var arrayFound = obj.items.Find({isRight:1})

Cela reviendrait alors

[{itemId:2,isRight:1}]

Je sais que je peux le faire avec une boucle pour chaque boucle, cependant, j'essaie d'éviter cela. Ceci est actuellement côté serveur sur une application Node.JS.

9
Jackie
var arrayFound = obj.items.filter(function(item) {
    return item.isRight == 1;
});

Bien sûr, vous pourriez aussi écrire une fonction pour trouver des éléments par un littéral d'objet en tant que condition:

Array.prototype.myFind = function(obj) {
    return this.filter(function(item) {
        for (var prop in obj)
            if (!(prop in item) || obj[prop] !== item[prop])
                 return false;
        return true;
    });
};
// then use:
var arrayFound = obj.items.myFind({isRight:1});

Les deux fonctions utilisent la méthode native .filter() on Arrays.

23
Bergi

Etant donné que Node implémente la spécification EcmaScript 5, vous pouvez utiliser Array # filter on obj.items.

3
shinzer0

édité pour utiliser la méthode native

var arrayFound = obj.items.filter(function() { 
    return this.isRight == 1; 
});
2
mathisonian

Jetez un coup d'œil à http://underscorejs.org Ceci est une superbe bibliothèque.

http://underscorejs.org/#filter

2
3on

Vous pouvez essayer de trouver le résultat attendu en utilisant la fonction find , vous pouvez voir le résultat dans le script suivant:

var jsonItems = {items:[
  {itemId:1,isRight:0},
  {itemId:2,isRight:1},
  {itemId:3,isRight:0}
]}

var rta =  jsonItems.items.find(
   (it) => {
     return it.isRight === 1;
   }
);

  
console.log("RTA: " + JSON.stringify(rta));

// RTA: {"itemId":2,"isRight":1}
1
Pablo Ezequiel

En fait, j'ai trouvé un moyen encore plus simple si vous utilisez mongoDB pour conserver vos documents ...

findDocumentsByJSON = function(json, db,docType,callback) {
  this.getCollection(db,docType,function(error, collection) {
    if( error ) callback(error)
    else {
      collection.find(json).toArray(function(error, results) {
        if( error ) callback(error)
        else
          callback(null, results)
      });
    }
  });
}

Vous pouvez ensuite passer {isRight: 1} à la méthode et renvoyer un tableau UNIQUEMENT des objets, me permettant ainsi de pousser le poids lourd au mongo compétent.

1
Jackie