2016-06-10 72 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

这应该是一个评论,而不是一个答案! –