2017-02-25 8 views
1

Hier ist, was ich zu tun habe:Entfernen eines Elements aus einem Array mit Filtermethode.

Sie werden mit einem anfänglichen Array (das erste Argument in der Zerstörer-Funktion), gefolgt von einem oder mehreren Argumenten zur Verfügung gestellt werden. Entfernen Sie alle Elemente aus dem ursprünglichen Array, die denselben Wert wie diese Argumente haben.

Mein Code:

function destroyer(arr) { 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== arguments[i]; 
    } 
    return x; 
} 

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

Aber es funktioniert nicht richtig und gibt den Ausgang Array nicht das gefilterte ein. Wo ist mein Fehler?

Antwort

3

Grundsätzlich haben Sie zwei Fragen,

  • arguments[i] in falsche Inhalte in einem Rückruf der Filterfunktion,

    function destroyer(arr) { 
        function filterer(val) { // <--------------------+ 
         return val !== arguments[i]; //    | 
         //    ^^^^^^^^^^^^ this points to --+ 
        } 
        for(i=1; i < arguments.length; i++) { 
         x = arr.filter(filterer); 
        } 
        return x; 
    } 
    
  • keine Zuordnung der Ergebnis für weitere Filterung. eine Funktion für weitere Tests in der Filtermethode

Lösung

  • nehmen eine Funktion mit einem Verschluss über den Werttest und zurück.

  • Verwenden Sie eine Variable mit arr als Startwert und weisen Sie das Filterergebnis zu. Dann gebe diesen Wert am Ende zurück.

function destroyer(arr) {   
 
    function filterer(testValue) {    // take arguments[i] value 
 
     return function (val) {     // return function as callback 
 
      return val !== testValue;   // use testValue instead of arguments[i] 
 
     } 
 
    } 
 

 
    var x = arr         // assign arr as start value for filtering 
 
    for (var i = 1; i < arguments.length; i++) { 
 
     x = x.filter(filterer(arguments[i])); // use filterer with a parameter 
 
    } 
 
    return x;         // return result 
 
} 
 

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

+1

var x = arr.slice (0) wäre besser, um nicht Eingabearray – pranavjindal999

+1

@PranavJindal 'filter' ist eine reine Funktion zu ändern und ändert nicht das Array es aufgerufen wird. Die Verwendung von 'slice' ist unnötig und fügt dem Overhead dieser Methode nur eine weitere Array-Erstellung hinzu. – gyre

+0

@gyre Filter nicht aber '' 'x = x.filter (filterer (Argumente [i])); '' 'tut – pranavjindal999

1

arguments Bereich wurde geändert.

Sie möchten arguments[i] innerhalb function filterer(val) {return val !== arguments[i];} verwenden, da es die Argumente der übergeordneten Funktion ist, die destroyer ist.

Wenn ja, verwenden filterer als Pfeil Funktion den Umfang der arguments zu halten.

function destroyer(arr) { 
    const filterer = (val) => { // ⚠️ This is an arrow function 
    return val !== arguments[i]; // ⬅️ "arguments" refers now to "destroyer()" args 
    } 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 


    return x; 
} 

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

eine Kopie von Argumenten machen widersprechen. Wie Abdennour sagte, ändert sich der Anwendungsbereich der Argumente Objekt für Filterer.

Erstellen Sie außerdem eine Kopie des Eingabearrays und filtern Sie nur von diesem Array weiter. Andernfalls wird Ihr Ergebnis nur nach dem letzten Argument gefiltert.

function destroyer(arr) { 
var copy = arguments; 
var x = arr; 
    for(i=1; i < copy.length; i++) { 
    x = x.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== copy[i]; 
    } 
    return x; 
} 

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