【问题标题】:javascript: sorting list of dicts by multiple (more than 2) keysjavascript:按多个(超过2个)键对字典列表进行排序
【发布时间】:2017-04-15 02:50:52
【问题描述】:

在 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 });

排序后,hits[0] key1 仍然是'c',我希望它是'a',这意味着我必须按三分之一排序。

PS:如您所见,key2 和 key3 的值是相同的,我不直接从 key1 排序,因为在我的真实 dic 列表中还有其他 dic,其中 key2 和 key3 看起来与此示例不同。

在python中我会简单地做:

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

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

这是部分数据:

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

【问题讨论】:

    标签: javascript list sorting dictionary


    【解决方案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));
    });
    

    这是否符合您的目的?

    【讨论】:

    • 它适用于 3 个 dics 的小列表,但是当我尝试使用许多键和 dics 的真实案例时,它不起作用。我已经添加了更多解释的第一篇文章
    • 您是否将 &gt; 反转为 &lt; ?因为用相同的输入运行最后一个代码 sn-p 给了我你更新的预期场景。
    猜你喜欢
    • 2014-02-11
    • 2020-10-04
    • 2016-12-11
    • 2013-11-02
    • 1970-01-01
    • 2019-12-30
    • 2013-09-16
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多