javascript:按多个(超过2个)键对字典列表进行排序

标签 javascript list sorting dictionary

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

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

还涉及其他 key ,但我认为它们不应该成为问题,因为我按 3 个 key 订购

有效的解决方案:

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

最佳答案

您的代码声明根据 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));
});

这符合您的目的吗?

关于javascript:按多个(超过2个)键对字典列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421675/

相关文章:

java - 上移、下移、指定位置

python - 使用python和tornado根据mongodb中的日期对列表进行排序

c++ - 在 Eclipse 中对 C++ 方法进行排序/按字母顺序排列(不在大纲中,在代码中)

javascript - 用 Javascript 设计 Watch 工具

javascript - 回调后在Flexslider中查找div

javascript - MVC 5 - 在客户端验证特定字段

c# - 如何在 C# 中对动态列表进行排序

list - 如何在flutter中使用List Iterable函数

list - 如何创建一个字典,将字符串映射到给定列表和元组的集合?

javascript - 使用 PHP 解析 CSS 文件