2017-12-20 6 views
1

Ich mache eine FreeCodeCamp-Abfrage, "suche und zerstöre", wo ich eine Funktion erstelle, die Elemente aus dem bereitgestellten Array entfernt.Filtern eines Arrays innerhalb eines Arrays

Gegeben
function destroyer(arr) { 
// Remove all the values 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

Das Ergebnis

[1, 1] 

sein sollte Während ich verschiedene Lösungen gesehen habe, wollte ich so, wenn ich die Lösung machen konnte ich auf der Arbeit gearbeitet hatte, weil ich es intuitiv war zu mir und wird hoffentlich zu einem besseren Verständnis der Filterung führen. Ich denke, der Grund, warum meine Lösung nicht funktioniert, ist, dass ich die Methode nicht richtig benutze.

filter(); 

Wie auch immer, hier ist mein Versuch:

function destroyer(arr) { 
// Remove all the values 
var args = Array.prototype.slice.call(arguments); 
//makes the arguments an array 

function destroy(value) { 


for (var i=1; i < args.length; i++) 
return value !==args[i]; 
// creates a loop that filters all arguments after the first one and removes from the initial argument, regardless of how many there are. 

} 

var filtered = arr.filter(destroy); 
return arr[0]; 
} 


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

Ich bemerkte, dass

var filtered = arr.filter(destroy); 

ist wahrscheinlich das Problem, weil die ersten drei Argumente gefiltert werden, aber nicht erstes Argument. Allerdings, wenn ich versuche,

var gefilterten = arr [0] .filter (zerstören); Was ich dachte, würde das erste Argument zielen, wird ein Fehler ausgelöst. Ist es möglich, das Problem auf diese Weise zu lösen? Ich wollte es auf diese Art und Weise zu tun, weil ich die Art, wie die folgende Funktion ist Setup:

function badValues(val){ 
return val !== 2; 
} 

function bouncer(arr) { 
    return arr.filter(badValues); 
} 

bouncer([1, null, NaN, 2, undefined]); 

und wollte 2 für die Argumente ersetzen, die entfernt werden müssen.

Danke allen!

+0

Vielleicht so etwas? 'function destroyer() { let args = Array.from (Argumente); let array = args [0]; args.shift(); return array.filter (e =>! Args.includes (e)) } ' – Brian

+0

Ihre' destroyer() 'Funktion benötigt nur ein Argument, aber Sie übergeben es drei. –

+0

Es gibt mehrere Probleme bei der Implementierung. Zum Beispiel kehrt die Funktion 'destroy' bei der 1. Iteration zurück. Erfahren Sie mehr über Javascript eingebaute Funktionen wie 'find',' filter', ... machen Ihren Code sauberer, smarter, lesbarer. – RaphaMex

Antwort

0

This ist ein funktionierendes Beispiel, wenn Sie die Lösung selbst entdecken möchten, lesen Sie es nicht, wenn Sie dies wirklich lösen wollen und lernen, müssen Sie read wie filter funktioniert. Du bist nah dran.

function destroyer(arr) { 
    var args = Array.prototype.slice.call(arguments); 

    var filtered = arr.filter(destroy); 

    // you must return the filtered array 
    return filtered; 

    function destroy(value) {  
    for (var i=1; i < args.length; i++){ 

     // you must return false if you find it so filter removes the value 
     if (value === args[i]) return false; 
    } 

    // if you loop through all and don't find it, return true so filter keeps the value 
    return true; 
    } 
} 

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

Ja danke! Ich habe versucht zu lesen, wie Filter funktioniert, aber es war schwierig für mich zu verstehen. Ich bin besonders verwirrt, weil in einem ähnlichen Problem, Funktion badValues ​​(val) { Rückgabewert! == false && val! == null && val! == 0 && val! == "" && val ! == undefined &&! Nummer.isNaN (val); } Funktion Bouncer (arr) { Rückkehr arr.filter (badValues); } Prahler ([1, null, NaN, 2, undefined]); Die Funktion funktioniert, ohne true und false zu verwenden, um Werte zu entfernen. – mso4491

+0

Tatsächlich sind Booleans in dieser Lösung beteiligt. Wenn Sie "!== "Sie verwenden einen Vergleichsoperator, alle Sätze mit diesem Operator geben einen booleschen Wert zurück. [Operatoren] (https://www.w3schools.com/jsref/jsref_operators.asp). – agustin37

Verwandte Themen