webentwicklung-frage-antwort-db.com.de

Suchen nach Elementen in einem JSON-Array mithilfe von Node (vorzugsweise ohne Iteration)

Momentan erhalte ich eine JSON-Antwort wie diese zurück ...

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

Ich möchte so etwas ausführen (Pseudocode)

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

Dies würde dann zurückkehren

[{itemId:2,isRight:1}]

Ich weiß, dass ich dies mit einer für jede Schleife tun kann, aber ich versuche dies zu vermeiden. Dies ist derzeit serverseitig in einer Node.JS-App.

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

Natürlich können Sie auch eine Funktion schreiben, um Elemente anhand eines Objekt-Literal als Bedingung zu finden:

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});

Beide Funktionen verwenden die Methode native .filter() on Arrays.

23
Bergi

Da Node die EcmaScript 5-Spezifikation implementiert, können Sie Array # filter on obj.items verwenden.

3
shinzer0

bearbeitet, um native Methode zu verwenden

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

Schauen Sie sich http://underscorejs.org Dies ist eine großartige Bibliothek.

http://underscorejs.org/#filter

2
3on

Sie können versuchen, das erwartete Ergebnis mit der Funktion find zu finden. Das Ergebnis sehen Sie im folgenden Skript:

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

Eigentlich habe ich einen noch einfacheren Weg gefunden, wenn Sie mongoDB verwenden, um Ihre Dokumente zu sichern ...

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)
      });
    }
  });
}

Sie können dann {isRight: 1} an die Methode übergeben und NUR ein Array der Objekte zurückgeben, sodass ich das schwere Heben zum fähigen Mongo schieben kann.

1
Jackie