假设我有一个项目列表,这些项目使用给定的比较器进行排序。我希望在排序为升序比较器(element[1], element[1+n]) 后,对于 n> 1 的所有值应该返回 -1,因为根据该比较器,元素 [1]
我正在执行自定义排序并发现排序后存在比较器(元素[1],元素[1+n])返回1的实例。当我查看实例时,我看到比较器给出了正确的输出,即元素[1]>元素[1+n]。我不明白在使用该比较器执行排序后会出现这种情况。
如果有人对我可能错过的微妙之处有任何想法,我会非常感谢他们的想法。另外,如果我能提供更多可能阐明的信息,请告诉我。
编辑 我认为这可能是一个更普遍的问题,但作为对 mplungjan 的回应,我在下面添加了自定义排序器。该排序适用于对象平面列表形式的分层数据集。每个对象都有一个 id,可能如下所示:0 表示根 1。0-0 表示其第一个孩子。第二个孩子0-1。等等
列表中的每个对象都有一个字段“parent”,该字段具有其父项的 id。本质上 data.sort 并没有做我认为应该做的事情。
function CurrencyTreeSorter(a, b) {
a_id = a.id.split("-");
b_id = b.id.split("-");
if(a_id.length != b_id.length || a_id.slice(0, a_id.length-1).toString() != b_id.slice(0, b_id.length-1).toString()){
var i = 0;
while (i < a_id.length && i < b_id.length && a_id[i] == b_id[i]) {
i++;
}
if (i == a_id.length || i == b_id.length){
return a_id.length > b_id.length ? 1 : -1;
}
else{
while (a.level > i) {
a = getParent(dataMap, a);
}
while (b.level > i) {
b = getParent(dataMap, b);
}
}
}
var x, y;
if (a[sortcol] == "-") {
x = -1;
}
else {
x = parseFloat(a[sortcol].replace(/[,\$£€]/g, ""));
}
if (b[sortcol] == "-") {
y = -1;
}
else {
y = parseFloat(b[sortcol].replace(/[,\$£€]/g, ""));
}
return sortdir * (x == y ? 0 : (x > y ? 1 : -1));
}