2017-07-20 9 views
0

Ich versuche, die Filtermethode für ein Array zu verwenden, um das Array basierend auf einer variablen Anzahl von Argumenten durchlaufen.JavaScript - Filter durch ein Array mit Argumenten mit for-Schleife

Unten ist mein Versuch dazu:

function destroyer(arr) { 
    var argArr = arr.slice.call(arguments, 1); 
    var filteredArray = arr.filter(function(val) { 
    for (var i = 0; i < argArr.length; i++) { 
     return val != argArr[i]; 
    }; 
    }); 
    console.log(filteredArray); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

Wenn ich dies tun, nur das erste Element des Arrays Argumente angeordnet. Dies deshalb zurück:

[1, 3, 1, 3] 

ich einige Beispiele Online möglicher Wege gefunden haben, dieses Problem zu beheben, aber sie sind sehr verschieden von dem, was ich verstehe nur noch. Gibt es eine Möglichkeit, meins zum Laufen zu bringen oder zu verstehen, warum die zusätzlichen Elemente des Array arguments nicht aufgerufen werden?

+1

Das "Problem", das auftritt, wird durch die 'return' Anweisung verursacht, die die Schleife effektiv auf _eine_Iteration begrenzt. – jensgram

Antwort

2

Wenn Sie ES6 Sie es mit rest Operator tun können, und Array#includes Funktion

function destroyer(arr, ...params){ 
 
    return arr.filter(item => !params.includes(item)); 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

Mit Ihrer Logik können Sie wie folgt zu tun. Wenn val ist gleich dem aktuellen argArr's Artikel dann return false, wenn nichts nach der Schleife gefunden: return true

function destroyer(arr) { 
 
    var argArr = Array.prototype.slice.call(arguments, 1); 
 
    var filteredArray = arr.filter(function(val) { 
 
    for (var i = 0; i < argArr.length; i++) { 
 
     if(val === argArr[i]){ 
 
      return false; 
 
     } 
 
    }; 
 
    return true; 
 
    }); 
 
    console.log(filteredArray); 
 
} 
 

 
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

+0

Danke dafür, genau das, was ich gesucht habe! – DaftVader

0

Denn mit Ihrem Code testen Sie immer, wenn aktuelle Element in Filter gleich ist oder nicht gleich dem zweiten Parameter in der Funktion, der 2 ist und wahr/falsch zurückgibt. Stattdessen können Sie indexOf verwenden, um zu testen, ob das aktuelle Element im Filter im Array arguments ist.

function destroyer(arr) { 
 
    var argArr = arr.slice.call(arguments, 1); 
 
    var filteredArray = arr.filter(function(val) { 
 
    return argArr.indexOf(val) == -1 
 
    }); 
 
    console.log(filteredArray); 
 
} 
 

 
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

0

Problem in der dieser Linie ist return val != argArr[i];

ändern Logik wie diese, vermeidet es auch zusätzliche Looping zu tun.

function destroyer(arr) { 
    var argArr = arr.slice.call(arguments, 1); debugger 
    var filteredArray = arr.filter(function(val) { 
    return !(argArr.indexOf(val) >= 0); 
    }); 
    console.log(filteredArray); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3);