javascript:按多个(超过2个)键排序dicts列表

时间:2017-04-15 02:50:53

标签: javascript list sorting dictionary

在javascript中,我一直试图通过两个以上的键对dics列表进行排序,但我遇到了问题。

hits = [
  {'key1': 'c', 'key2': 'c1', 'key3': 10},
  {'key1': 'a', 'key2': 'c1', 'key3': 10},
  {'key1': 'b', 'key2': 'c1', 'key3': 10}
  ]

//sorting by two keys
hits.sort(function(a,b) {
       return a.key2 != b.key2? (a.key2 < b.key2? -1 : 1) :
 a.key3 - b.key3 });

排序后,点击[0]键1仍然是&#39; c,我希望它是&#39; a&#39;,这意味着我必须按三分之一排序。

PS:你可以看到key2和key3的值是相同的,我不直接从key1排序,因为在我的真实dics列表中还有其他dics,其中key2和key3看起来与这个例子不同。

在python中,我只会这样做:

hits.sort(key=itemgetter('key2', 'key3',"key1"))

它适用于小型测试,但是当我尝试使用包含许多dics的列表时,结果没有意义。

以下是数据的一部分:

Key 2     Key3       key1
chr1           11       chr1_K892
chr1           11       chr1_K761
chr2           10       chr2

以下是排序后的看法

Key 2     Key3       key1
chr2           10        chr2
chr1           11        chr1_K892
chr1           11        chr1_K761

我认为应该是:

Key 2     Key3       key1
chr1           11        chr1_K761
chr1           11        chr1_K892
chr2           10        chr2

还有其他关键因素,但它们并不是一个问题,我认为因为我按3键排序

有效的解决方案:

        hits.sort(function(a, b) {
            if(a.key2 < b.key2)
                return -1;
            if(a.key2 > b.key2)
                return 1;
            if(a.key3 < b.key3)
                return -1;
            if(a.key3 > b.key3)
                return 1;
            if(a.key1 < b.key1)
                return -1;
            if(a.key1 > b.key1)
                return 1;

            return 0;
        });

1 个答案:

答案 0 :(得分:1)

您的代码声明根据key2的值按递增顺序排序。如果两个对象的key2值相同,则会根据key3进行排序 代码中根本没有引用key1。 如果您想根据key按递增顺序排序,则可以执行以下操作:

hits = [
    {'key1': 'c', 'key2': 'c1', 'key3': 10},
    {'key1': 'a', 'key2': 'c1', 'key3': 10},
    {'key1': 'b', 'key2': 'c1', 'key3': 10}
];
hits.sort(function (a, b) {
    return a.key1!=b.key1 ? (a.key1 < b.key1 ? -1 : 1) : 0;
});

或者,如果您想基于key2,key3和key1进行排序,您可以使用:

hits = [
    {'key1': 'c', 'key2': 'c1', 'key3': 10},
    {'key1': 'a', 'key2': 'c1', 'key3': 10},
    {'key1': 'b', 'key2': 'c1', 'key3': 10}
];
hits.sort(function (a, b) {
    return a.key2 != b.key2 ? a.key2 > b.key2 : (a.key3 != b.key3 ? a.key3 > b.key3 : (a.key1 != b.key1 ? a.key1 > b.key1 : 0));
});

这是否符合您的目的?