0

假设我有一个项目列表,这些项目使用给定的比较器进行排序。我希望在排序为升序比较器(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));

}
4

1 回答 1

3

事实证明这是 Chrome 的一个问题,在此处此处进行了描述。从本质上讲,从比较器/比较器返回零是不安全的。

于 2012-10-05T11:35:06.807 回答