2016-06-10 75 views
1

這個問題看起來很愚蠢,但我無法找出我做錯了什麼。Javascript - 嵌套數組排序不能按預期工作

我想對基於特定索引的嵌套數組進行排序。如果我繼續對數組進行排序,則數組每次不斷變化,而不應該如此。而且,這個問題在陣列長度有點小時沒有得到重現。

// 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; 
    }); 
    } 
}]); 

添加的代碼上plunker @https://plnkr.co/edit/B99a28LBGLojcDtuBM2i

向下滾動,然後單擊sortMe按鈕。您可以在每次點擊按鈕時看到表格行中的更改。

在此先感謝。你會杜絕了我的痛苦;)

+0

你想要排序的副本嗎? –

+0

如果數組已被排序,爲什麼再次排序會給出不同的結果? – Sanjay

+0

排序a到z升序有什麼不對? – SuperComupter

回答

1

對於一個穩定的排序後,你需要另一個參數,如第三元件。

排序只使用部分數據進行檢查,如回調。如果一張支票返回0,由於內容相同,排序算法不知道,如果a出現在b之前或相反。在這種情況下,我們需要另一個屬性來決定結果應該在哪個範圍內完成。欲瞭解更多詳細信息,請訪問Wikipedia

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

感謝您的解決方案。它解決了這個問題。你能擴展你的答案爲什麼它首先發生? – Sanjay

+2

@Sanjay你的代碼不關心最後一項。 JS排序算法(在我的情況下是V8)並不關心在同等密鑰之間的排序。我猜想由於內部工作的原因,後面找到的項目以相同的鍵值到組的前面。因此,每次按下排序時,後面的一個都會移到前面。爲了防止這種情況發生,你必須告訴排序功能以考慮最後一項。就像妮娜在她的編碼中所做的一樣。如果'a [1] .localeCompare(b [1])'返回'0'(比較a [1]項目是相同的),那麼就去檢查'a [2]'項目。 – Redu

0

您對Plunker代碼工作正常,再檢查,因爲我不覺得任何改變一下sortMe按鈕

+0

您可以看到更改。 (power,60)和(power,2)行在每次點擊排序按鈕時都會互換 – Sanjay

+0

您只對元素[1]進行排序,即「power」,爲什麼您認爲element [2]要排序互換? – Holger

+0

這應該是一個評論,而不是一個答案! –