在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;
});
答案 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));
});
这是否符合您的目的?