2016-06-10 20 views
1

Das Problem sieht ziemlich albern, aber ich bin nicht in der Lage, herauszufinden, was ich falsch mache.Javascript - Nested Array Sortierung funktioniert nicht wie erwartet

Ich versuche, ein verschachteltes Array basierend auf einem bestimmten Index zu sortieren. Wenn ich das Array weiter sortiere, wird das Array jedes Mal geändert, was nicht der Fall sein sollte. Außerdem wird dieses Problem nicht reproduziert, wenn die Array-Länge etwas klein ist.

// Code goes here 
var app = angular.module("myApp", []); 

app.controller("someController", ['$scope', function($scope) { 
    $scope.AppTitle = "Array sort Issue"; 

    $scope.testArray = [ 
    ["2016-04-10T18:30:00.000Z", "b20", 104], 
    ["2016-04-10T18:30:00.000Z", "b20", 81], 
    ["2016-04-10T18:30:00.000Z", "b20", 29], 
    ["2016-04-10T18:30:00.000Z", "b20", 1], 
    ["2016-04-10T18:30:00.000Z", "n0c", 155], 
    ["2016-04-10T18:30:00.000Z", "n0c", 21], 
    ["2016-04-10T18:30:00.000Z", "n0c", 12], 
    ["2016-04-10T18:30:00.000Z", "n0c", 10], 
    ["2016-04-10T18:30:00.000Z", "n0c", 8], 
    ["2016-04-10T18:30:00.000Z", "n0c", 8], 
    ["2016-04-10T18:30:00.000Z", "ecty", 101], 
    ["2016-04-10T18:30:00.000Z", "ecty", 58], 
    ["2016-04-10T18:30:00.000Z", "adgi", 127], 
    ["2016-04-10T18:30:00.000Z", "adgi", 24], 
    ["2016-04-10T18:30:00.000Z", "ath", 77], 
    ["2016-04-10T18:30:00.000Z", "ath", 60], 
    ["2016-04-10T18:30:00.000Z", "hry", 124], 
    ["2016-04-10T18:30:00.000Z", "hry", 8], 
    ["2016-04-10T18:30:00.000Z", "tfan", 132], 
    ["2016-04-10T18:30:00.000Z", "sr", 96], 
    ["2016-04-10T18:30:00.000Z", "hwdg", 59], 
    ["2016-04-10T18:30:00.000Z", "hwdg", 15], 
    ["2016-04-10T18:30:00.000Z", "hwdg", 14], 
    ["2016-04-10T18:30:00.000Z", "hwdg", 6], 
    ["2016-04-10T18:30:00.000Z", "alub", 88], 
    ["2016-04-10T18:30:00.000Z", "ax0", 43], 
    ["2016-04-10T18:30:00.000Z", "ax0", 40], 
    ["2016-04-10T18:30:00.000Z", "ax0", 4], 
    ["2016-04-10T18:30:00.000Z", "ax0", 1], 
    ["2016-04-10T18:30:00.000Z", "voin", 67], 
    ["2016-04-10T18:30:00.000Z", "voin", 19], 
    ["2016-04-10T18:30:00.000Z", "voin", 2], 
    ["2016-04-10T18:30:00.000Z", "p", 87], 
    ["2016-04-10T18:30:00.000Z", "ttm", 65], 
    ["2016-04-10T18:30:00.000Z", "ttm", 18], 
    ["2016-04-10T18:30:00.000Z", "bre", 78], 
    ["2016-04-10T18:30:00.000Z", "bre", 1], 
    ["2016-04-10T18:30:00.000Z", "dew", 41], 
    ["2016-04-10T18:30:00.000Z", "dew", 33], 
    ["2016-04-10T18:30:00.000Z", "cgu", 19], 
    ["2016-04-10T18:30:00.000Z", "cgu", 15], 
    ["2016-04-10T18:30:00.000Z", "cgu", 13], 
    ["2016-04-10T18:30:00.000Z", "cgu", 6], 
    ["2016-04-10T18:30:00.000Z", "cgu", 4], 
    ["2016-04-10T18:30:00.000Z", "cgu", 4], 
    ["2016-04-10T18:30:00.000Z", "cgu", 3], 
    ["2016-04-10T18:30:00.000Z", "cgu", 3], 
    ["2016-04-10T18:30:00.000Z", "cgu", 1], 
    ["2016-04-10T18:30:00.000Z", "cgu", 1], 
    ["2016-04-10T18:30:00.000Z", "cgu", 1], 
    ["2016-04-10T18:30:00.000Z", "an", 69], 
    ["2016-04-10T18:30:00.000Z", "hwo", 69], 
    ["2016-04-10T18:30:00.000Z", "camel", 68], 
    ["2016-04-10T18:30:00.000Z", "mysore", 67], 
    ["2016-04-10T18:30:00.000Z", "power", 60], 
    ["2016-04-10T18:30:00.000Z", "power", 2], 
    ["2016-04-10T18:30:00.000Z", "www", 49], 
    ["2016-04-10T18:30:00.000Z", "www", 10], 
    ["2016-04-10T18:30:00.000Z", "hgyp", 35], 
    ["2016-04-10T18:30:00.000Z", "hgyp", null], 
    ["2016-04-10T18:30:00.000Z", "hgyp", 4], 
    ["2016-04-10T18:30:00.000Z", "igne", 43], 
    ["2016-04-10T18:30:00.000Z", "igne", 13], 
    ["2016-04-10T18:30:00.000Z", "weight", 54], 
    ["2016-04-10T18:30:00.000Z", "hbk", 50] 
    ] 

    $scope.sortTable = function() { 
    $scope.testArray.sort(function(a, b) { 
     if (a[1] > b[1]) 
     return 1; 
     if (b[1] > a[1]) 
     return -1; 
     return 0; 
    }); 
    } 
}]); 

Added der Kodex auf Plunker @https://plnkr.co/edit/B99a28LBGLojcDtuBM2i

Scroll nach unten und klicken Sie auf die Schaltfläche sortiermich. Sie können die Änderung in den Tabellenzeilen bei jedem Klick auf die Schaltfläche sehen.

Vielen Dank im Voraus. Sie würden einen Anschlag zu meinem Elend setzen;)

+0

Sie möchten eine sortierte Kopie? –

+0

Wenn das Array bereits sortiert ist, warum würde das erneute Sortieren zu einem anderen Ergebnis führen? – Sanjay

+0

Was ist falsch seine Sortierung von A nach Z aufsteigend? – SuperComupter

Antwort

1

Für eine stabile Art sortiermich Schaltfläche klicken, können Sie einen anderen Parameter benötigen, wie die dritte Element.

Bei der Sortierung werden nur Teile der Daten verwendet, die überprüft werden sollen, wie bei Ihrem Rückruf. Wenn ein Check 0 zurückgibt, weiß der Sortieralgorithmus wegen des gleichen Inhalts nicht, ob a vor b oder rückwärts kommt. In diesem Fall brauchen wir eine andere Eigenschaft, um zu entscheiden, in welchem ​​Bereich das Ergebnis liegen soll. Für weitere und detaillierte Informationen besuchen Sie bitte Wikipedia.

$scope.testArray.sort(function (a, b) { 
    return a[1].localeCompare(b[1]) || a[2] - b[2]; 
}); 
+0

Danke für Ihre Lösung. Es behebt das Problem. Könnten Sie Ihre Antwort näher erläutern, warum passiert das überhaupt? – Sanjay

+2

@Sanjay Ihr Code kümmert sich nicht um den letzten Punkt. Der JS-Sortieralgo (in meinem Fall der V8) kümmert sich nicht um die Sortierung unter den gleichen Schlüsseln. Ich nehme an, aufgrund der inneren Arbeit nimmt es den später gefundenen Gegenstand mit dem gleichen Schlüsselwert an die Vorderseite der Gruppe. Jedes Mal, wenn Sie auf sort drücken, bewegt sich der eine auf der Rückseite nach vorne. Um dies zu verhindern, müssen Sie der Sortierfunktion mitteilen, dass auch der letzte Punkt berücksichtigt werden soll. Genauso wie Nina in ihrer Kodierung. Wenn 'a [1] .localeCompare (b [1])' '' 0 '' zurückgibt (verglichen mit [1] Elementen sind die gleichen), dann überprüfen Sie die 'a [2] 'Elemente. – Redu

0

Ihr Code auf Plunker gut funktioniert, klicken Sie hier, weil ich etwas ändern nicht finden, nach

+0

Sie können eine Änderung sehen. (power, 60) und (power, 2) Zeilen werden bei jedem Klick auf die Sortierschaltfläche vertauscht – Sanjay

+0

Sie sortieren nur nach Element [1], dh "power", warum sollte Element [2] sortiert werden oder nicht ausgetauscht werden? – Holger

+0

Dies sollte ein Kommentar sein und keine Antwort! –

Verwandte Themen