2016-04-29 12 views
-1

Ich habe eine JSON-Datei in JavaScript-Objekt sowie einen Jahr-Parameter konvertiert und ich möchte nur das relevante Array mit seinem Namen und Inhalt als JSON zurückgeben.Wie schneidet man ein JavaScript-Objekt?

Die Datei sieht wie folgt aus:

{ 
"2012":[ 

    { 
     "id": 1, 
     "firstName": "John", 
     "lastName": "Doe", 
     "GPA": 80 
    }  

], 
"2013":[ 

    { 
     "id": 1, 
     "firstName": "John", 
     "lastName": "Doe", 
     "GPA": 85 
    }, 
    { 
     "id": 2, 
     "firstName": "Anna", 
     "lastName": "Smith", 
     "GPA": 92 
    } 

] 
} 

ich die folgende Funktion bin mit dem Array zu finden und löschen Sie alle recoreds mit GPA < 90:

getExcellenceByYear: function(year) { //get all students with GPA>=90 by year 

     fake=JSON.parse(JSON.stringify(file)); 
     keys = Object.keys(fake); 
     if(fake.hasOwnProperty(year)) 
     { 

    for(var j=fake[year].length-1; j>=0; j--) // delete all irrelevant records 
    { 
     if(fake[year][j].GPA<90) 
     { 
      delete fake[year][j]; 
      fake[year]=fake[year].filter(function(x) {return x!==null}); 
     } 
    } 


} 
else 
return JSON.stringify({}); 

return JSON.stringify(fake[year]);    
} 

aber ich bin der Rückkehr nur die Datensätze im Array, wenn ich auch den Namen brauche, zum Beispiel:

Danke

+1

Javascript Karte Funktionen nachzuschlagen. Ich denke, es könnte besser sein, ein neues Objekt mit den gewünschten zu erstellen, anstatt es zu löschen. Ich habe ein Tutorial über Kartenfunktionen gesehen und das machen sie. Ich erinnere mich nicht genug Details darüber, wie es funktioniert, also kann ich kein Beispiel geben. – markbernard

+0

Wie ermitteln Sie die Relevanz? –

Antwort

3

Anstatt Ihre Quelldaten zu ändern, extrahieren Sie einfach die Bits, die ein Prädikat übergeben. Hier ist ein Beispiel unter Verwendung von Array.prototype.filter:

var data = { 
 
    "2012":[ 
 
     { 
 
      "id": 1, 
 
      "firstName": "John", 
 
      "lastName": "Doe", 
 
      "GPA": 80 
 
     }  
 

 
    ], 
 
    "2013":[ 
 
     { 
 
      "id": 1, 
 
      "firstName": "John", 
 
      "lastName": "Doe", 
 
      "GPA": 85 
 
     }, 
 
     { 
 
      "id": 2, 
 
      "firstName": "Anna", 
 
      "lastName": "Smith", 
 
      "GPA": 92 
 
     } 
 
    ] 
 
}; 
 

 
function getByYear(year, gpaThreshold) { 
 
    if (!data[year]) { 
 
    return null; 
 
    } 
 
    
 
    var obj = {}, 
 
     aboveGPAThreshold = data[year].filter(function(datum) { 
 
     return datum.GPA >= gpaThreshold; 
 
     }); 
 
    
 
    obj[year] = aboveGPAThreshold; 
 
    
 
    return obj; 
 
}; 
 

 
console.log(getByYear('2013', 90));

+1

Schön, dass ich gerade posten wollte. Ich möchte hinzufügen, dass, wenn OP die Kontrolle über die JSON-Datei hat, er es zu einem Array von Jahren machen sollte und nicht zu einem Objekt, dessen Eigenschaften Jahre sind: Es würde es möglich machen, das Array nur zu filtern, anstatt ein neues Objekt und ordnen Sie ihm das Jahr des Interesses zu. – Aaron

+1

OP möchte auch nach GPA filtern, also ist die Indexierung nach Jahr nicht wirklich eine schlechte Idee. Sie können nach den Filterkriterien (GPA oder Jahr) wirklich indizieren. –

+1

Sicher, ich meine, dass es einfacher wäre, ein '[{Jahr: 2013, Studenten: [...]}, {Jahr: 2014, Studenten: [...]}, ...]' Array eher zu filtern als das aktuelle Objekt. – Aaron

Verwandte Themen