在 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/