2014-01-30 23 views
5

Was mache ich hier falsch: Gleiche Ergebnisse in IE9 und FF.Javascript Sortierung funktioniert nicht nach Push?

function TestArrayOperationsClick() 
{ 
    function sortNums(a, b) 
    { 
    return a - b; 
    } 
    var array = [6, 4, 2, 8]; 
    console.log("Array 1: " + array); 
    array.sort(sortNums); 
    console.log("Sort 1: " + array); 
    array.push([1, 5, 10]); 
    console.log("Array 2: " + array); 
    array.sort(sortNums); 
    console.log("Sort 2: " + array); 
} 

Ausgang:

LOG: Array 1: 6,4,2,8 

LOG: Sort 1: 2,4,6,8 

LOG: Array 2: 2,4,6,8,1,5,10 

LOG: Sort 2: 2,4,6,8,1,5,10 <- not sorted. 

Antwort

10

Für array.push(...), sollten Sie einzelne Argumente werden vorbei, kein Array:

array.push(1, 5, 10); 

, für die die endgültige Ausgabe wäre dann:

Sort 2: 1,2,4,5,6,8,10 

Ot chts, sonst ist das Ergebnis Ihrer Push eigentlich diese:

[2,4,6,8,[1,5,10]] 

, obwohl es nicht klar ist zeigt, wenn Sie console.log tun.

Bearbeiten: Wie Jonathan erwähnt, wenn Sie eine Reihe von Elementen anhängen möchten, .concat() ist der Weg zu gehen.

+0

Danke Herman und alle anderen die darauf hingewiesen haben. Mein Fehler. – Dean

6

.push() kombiniert keine Array s wie die folgende erscheint zu erwarten:

array.push([1, 5, 10]); 

Statt die einzelnen Werte zu drücken, drückt er den zweiten Array selbst, was zu:

[ 2, 4, 6, 8, [ 1, 5, 10 ] ] 

zu eine anfügen Array auf eine andere, können Sie .concat():

verwenden
+0

Array gibt ein neues Array zurück. Wenn Sie das vorhandene Array modifizieren möchten, indem Sie alle Elemente eines anderen Arrays verschieben, können Sie Folgendes tun: array.push.apply (array, [1, 5, 10]) – lrn

+0

@lrn Ja, wenn Sie es nicht ernst meinen ein Mutator, können Sie '.push.apply()' verwenden. ES6's [spread operator] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator) wird es auch vereinfachen: 'array.push (... [1, 5, 10]) '. –

1

Wie bereits erwähnt, für array.push sollten Sie einzelne Argumente wie im Beispiel passieren:

array.push(1, 5, 10); 

Aber Sie können folgende Möglichkeiten, den Inhalt eines Arrays in ein anderes Array hinzuzufügen:

Array.prototype.push.apply(array, [1, 5, 10]); 

Auf diese Weise können Sie ein Array als Argument übergeben, da die apply()-Funktion das zweite Argument (das ein Array sein muss) in einzelne Argumente umwandelt;)

Verwandte Themen