2016-04-11 3 views
0

Ich bin für die Suche nach einer JSON-Datei abhängig von Benutzereingaben von der vorherigen Seite mit Unterstreichung in einer Express-Js-App. Dies ist, was ich bisher getan:Filtern eines JSON-Objekts in Node/expressjs

var fs = require('fs'); 
var contents = fs.readFileSync("public/files/testFile.json"); 
var obj = JSON.parse(contents); 
var gender = req.query.gender 

var filtered = _.where(obj.elements, {gender: true}); // elements is the array I want to filter 

Die json ich Filter bin versucht, ist die folgende:

{ 
    "elements": [ 
    { 
     "id": 0, 
     "man": true, 
     "url": "https://pbs.twimg.com/media/CfRi_u8aaW8AfQvI7v.jpg" 
    }, 
    { 
     "id": 1, 
     "Woman": true, 
     "url": "https://pbs.twimg.com/media/CfZ-8ikafWsAAngQGP.jpg" 
    } 
] 
} 

Beachten Sie, dass, wenn ich das gleiche tun die Variable Geschlecht von „Mann zu ändern "Es funktioniert ordnungsgemäß.Sieht aus wie funktioniert eine Variable für eine Suche wie diese nicht. Ich habe 2 Fragen:

  1. Was könnte ich tun, damit es funktioniert?
  2. Gibt es einen besseren Weg, um das Problem zu begegnen?
+0

Bitte zeigen Sie uns die JSON –

+2

Klassische Fall von missbräuchlichen Schlüsseln als Datenträger. Die Schlüssel des Objekts sollten nicht "Mann" und "Frau" genannt werden. Das sind Daten. Nennen Sie es "Geschlecht" und geben Sie ihm unterschiedliche Werte. – Tomalak

+0

Das wäre eine effizientere Möglichkeit, es zu tun, aber immer noch nicht das Filterproblem zu lösen;). Ich möchte einige neue Felder hinzufügen, so dass ich nicht weiß, ob eine solche Filterung die beste Option ist. – ZanattMan

Antwort

3

Warum Sie folgende nicht versuchen:

var _ = require('underscore'); 
var elem = { 
    "elements": [ 
     { 
      "id" : 0, 
      "man": true, 
      "url": "https://pbs.twimg.com/media/CfRi_u8W8AQvI7v.jpg" 
     }, 
     { 
      "id" : 1, 
      "woman": true, 
      "url" : "https://pbs.twimg.com/media/CfZ-8ikWsAAnQGP.jpg" 
     } 
    ] 
}; 
var gender = 'man'; 
var filtered = _.filter(elem.elements, function(element){ 
    return _.has(element, gender) && element[gender] === true; 
}); 
console.log(filtered); 

ich hier den Wert des Geschlechts fest einprogrammiert haben. Sie können das aus der Abfrage in Ihrer App lesen. Ich denke, das Snippet ist ziemlich selbsterklärend.

+0

Dies löst das Problem und macht es funktioniert. Vielen Dank! Obwohl die zweite Frage noch unbeantwortet ist. Ist das der beste Weg? Ich plane, mehr Variablen hinzuzufügen, um mit zu filtern ... – ZanattMan

+0

Wenn Leistung das primäre Anliegen ist, würde ich vorschlagen, dass Sie einen Hash von Geschlecht => Element (beim App-Start vielleicht) erstellen, so dass Sie nicht durchlaufen werden die Liste bei jeder Anfrage. Abgesehen davon, wie andere bereits erwähnt haben, sollte der Schlüssel idealerweise Geschlecht mit Wert als Ihre Daten sein. –

0

Sie können ein neues Json-Objekt erstellen.

var obj = {}; 
obj[req.query.gender] = true; 
var filtered = _.where(obj.elements, obj); 

Obwohl ich könnte darauf hindeuten, mit Werten Männer/Frauen ein Geschlecht Feld mit, anstatt männlich: true oder weiblich: true.

+0

Damit wird das Filtern der Arbeit gestoppt. Dieser Aufruf gibt das JSON-Objekt so zurück, wie es ist. – ZanattMan

+0

Der Knoten interpretiert die Geschlechtsvariable als "Geschlecht", also versucht er, das JSON-Feld nach Geschlecht zu filtern, das nicht existiert. –