2017-02-07 2 views
-1

Ich versuche, mehrere Arrays zu einem zu reduzieren und doppelte Elemente im Array für eine Übung von FCC zu entfernen.Warum verhält sich splice() seltsam?

Konkret zeigt die Spleißmethode eine Sache in der Konsole, aber verhält sich anders. Kann mir jemand sagen, warum splice() nicht die Duplikate löscht, die ich mit der verschachtelten Schleife identifiziert habe?

function uniteUnique(arr) { 
    var arr1 = arguments; 
    newArr= []; 

    for(var i=0; i<arr1.length; i++){ 
    for(var l=0; l<arr1[i].length; l++){ 
     newArr.push(arr1[i][l]); 
    } 
    } 
    console.log(newArr); 
    for(var t=0; t<newArr.length; t++){ 
    for(var p=0; p<newArr.length; p++){ 
     if(newArr[t]===newArr[p+1]){ 
     console.log("without splice ", newArr[p+1]); 
     console.log("with splice ", newArr.splice(newArr[p+1],1)) 
     newArr.splice(newArr[p+1],1); 
     } 
    } 
    } 
    return newArr; 
} 

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])); 

Ausgabe [4,1]. Aber ausgeben sollte [1,3,2,5,4]

erste Iteration Log: ohne Spleiß 1 mit splice [3]

Zweitens: ohne Spleiß 1 mit Spleiß [2]

Drittens: ohne Spleiß 2 mit splice [4]

Viertens: ohne splice 1 mit splice [2]

+0

Wie ist 'splice' _„weird'_ in der Konsole verhält sich hier? Du bist keine Aussage/Ausdruck in Bezug auf sie abgesehen von dem Endergebnis. – Pineda

+0

@Pineda \t \t console.log (Anmeldung“ohne splice" , newArr [p + 1]); \t \t console.log ("mit splice", newArr.splice (newArr [p + 1], 1)) – stepbystep

+0

editieren Sie bitte Ihre Frage, um den Kontext Ihres Kommentars anzugeben. – Pineda

Antwort

1

Sie haben hier drei Fehler:

  1. gibt es keine Notwendigkeit p+1 hier zu verwenden. Verwenden Sie einfach .

  2. splice erwartet einen Index als erstes Argument, aber Sie sind das Bestehen der Wert für die Entfernung betrachtet wird als Index der Entfernung durchzuführen. Dies ist nicht sinnvoll. Anstelle von .splice(newArr[p], 1) benötigen Sie .splice(p, 1).

  3. Sie verhindern nicht, dass ein Wert gegen sich selbst als potenzielles Duplikat betrachtet wird. Ihre if Bedingung muss auch die Bedingung enthalten ... && p!=t seit newArr[t]===newArr[p] immer (unnütz) richtig sein für den Fall, dass t gleich p

+0

Das ist wahr, aber geben weg die Antwort als OP nicht für eine vollständige Antwort auf den Algorithmus, oder vielleicht bin ich engstirnig - auch Upvoting für die Willen der Genauigkeit deiner Antwort – axelduch

+0

Völlig nicht verbunden: Liebe dein conways Spiel des Lebenprofils Beschreibung: D – axelduch

+0

@apsillers du hast Recht, ich habe alle 3 Sachen geändert, die du erwähnte plus es gab ein 4. Problem mit dem Algorithmus: Weil ich das Array spilicing war Der p-Index würde ein Element bei jeder Verkürzung des Arrays überspringen. Um das zu überwinden, fügte ich am Ende der Bedingung ** p- = 1; ** hinzu. Vielen Dank. – stepbystep

0

ein Array in seiner Schleife etwas empfohlen ist Ändern nicht. Wenn Sie keinen Spleiß verwenden müssen, erstellen Sie einfach ein brandneues Array und drücken Sie Werte, indem Sie suchen und wenn nicht bereits vorhanden sind.

function uniteUnique() { 

    var newArr = []; 
    for(var i=0; i<arguments.length; i++) { 
    var arr = arguments[i]; 
    for(var j=0; j<arr.length; j++) { 
     if(newArr.indexOf(arr[j]) == -1) { 
     newArr.push(arr[j]); 
     } 
    } 
    } 

    return newArr; 
} 

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1])); 
0

In Bezug auf die Entfernung von Duplikaten „in place“ in Ihrem Ansatz, Spleiß funktioniert gut und Ihr Algorithmus ist fast gut, versuchen Sie, durch jeden Schritt der Iterationen nach der Abflachung zu debuggen, um die Duplikate zu entfernen.

Sie laufen n-mal quadriert (weil p = t und Sie iterieren p * t mal). Aber , tut etwas nicht, was Sie wollen, haben einen Blick auf diese:

if(newArr[t]===newArr[p+1]){ // HERE IT WON'T DO WHAT YOU WANT 

Ich bin nicht die Antwort geben weg gehen, wenn Sie es erwähnen, ich bin nur, dass das Problem zu demonstrieren versuchen, verlässt sich nicht auf den Spleiß selbst, sondern auf Ihren Algorithmus.

Die andere Linie, die Sie benötigen würden

diese
newArr.splice(newArr[p+1],1); 

Grundsätzlich mit einigen Änderungen in diesen beiden Linien zu ändern wäre, würden Sie das Ziel erreichen, die Duplikate zu entfernen.

+0

Danke Kumpel für Ihre Ermutigung. Ich habe nicht aufgegeben und mit deinen Tipps und dem von @ -apsillers habe ich das Skript zum arbeiten bekommen. – stepbystep

Verwandte Themen