2016-04-21 6 views
0

Ich habe das folgende Array und ich habe eine Funktion zum Zurückgeben von Elementen aus dem Array basierend auf dem übergebenen Filter erstellt.Erstellen Sie eine if-Bedingung dynamisch

var students = [ 
    //name  grade room  gender 
    ["name1", 80,  "Farabi", "K"], 
    ["name2", 73,  "B1",  "K"], 
    ["name3", 73,  "B1",  "K"], 
    ["name4", 60,  "Farabi", "K"], 
    ["name5", 80,  "B1",  "E"], 
    ["name6", 43,  "Farabi", "E"], 
]; 

function getGrades() { 
    var grades = []; 
    for (var i = 0; i < students.length; i++) { 
     if (students[i][arguments[0][1]] == arguments[0][0]) { 
      grades.push(students[i][1]); 
     } 
    } 
    return grades; 
} 

getGrades(["E", 3]); // [gender, column index] 

Dies funktioniert so lange, wie ich einen einzelnen Filter passiere. Wenn ich zwei Filter übergeben möchte, z. B. getGrades(["E", 3], ["B1", 2]), funktioniert es nicht.

Ich brauche eine Möglichkeit zum Konfigurieren (erweitern) der If-Bedingung students[i][arguments[0][1]] == arguments[0][0] basierend auf den übergebenen Argumenten.

Für getGrades(["E", 3], ["B1", 2]), wenn die Bedingung

sein sollte
students[i][arguments[0][1]] == arguments[0][0] && students[i][arguments[1][1]] == arguments[1][0] 

Wie kann ich dynamisch ein, wenn die Bedingung erstellen?

Antwort

1

Anstatt zu versuchen, dynamisch eine if-Bedingung zu erstellen, können Sie jedes der Argumente durchlaufen und einzeln prüfen. Wenn einer von ihnen versagt, scheitern alle. Ebenso, wenn keiner von ihnen fehlschlägt, wissen Sie, dass das Gesamtergebnis gültig ist.

for (var i = 0; i < students.length; i++) { 
    var student = students[i]; 
    var matched = true; // This won't change if all of the conditions pass 
    for (var j = 0; j < arguments.length; j++) { 
    var filter = arguments[j]; 
    if (student[filter[1]] !== filter[0]) { 
     matched = false; // One of the conditions failed, don't check the rest 
     break; 
    } 
    } 
    if (matched) { 
    grades.push(student[1]); 
    } 
} 
0

Eine alternative Implementierung mit getGradesFunctional Programming

var students = [ 
 
    //name  grade room  gender 
 
    ["name1", 80,  "Farabi", "K"], 
 
    ["name2", 73,  "B1",  "K"], 
 
    ["name3", 73,  "B1",  "K"], 
 
    ["name4", 60,  "Farabi", "K"], 
 
    ["name5", 80,  "B1",  "E"], 
 
    ["name6", 43,  "Farabi", "E"], 
 
]; 
 

 

 
function getGrades(){ 
 
    var filters = Array.prototype.slice.call(arguments); //converts all passed filters to array 
 
    return filters.reduce(function(result,filter){  //result is filtered student list till now 
 
     return result.filter(function(student){   //return new filtered list 
 
     return student[filter[1]] === filter[0]; 
 
     }); 
 
    },students).map(function(student){     //map filtered students to their grades 
 
     return student[1]; 
 
    }) 
 
} 
 

 
document.write(getGrades(["E", 3], ["B1", 2]));

Verwandte Themen