0

特定のコンパレータを使用してソートされたアイテムのリストがあるとします。昇順で並べ替えた後、コンパレーター(要素[1]、要素[1 + n])はn> 1のすべての値に対して-1を返すはずです。そのコンパレーターによると、要素[1]

カスタムソートを実行していて、ソート後にコンパレーター(要素[1]、要素[1+n])が1を返すインスタンスがあることがわかりました。インスタンスを見ると、コンパレーターが正しい出力、つまり要素を提供していることがわかります[1]>要素[1+n]。そのコンパレータで並べ替えを実行した後、これがどのように当てはまるかわかりません。

私が見逃したかもしれない微妙な点について誰かが何か考えを持っているなら、私は彼らの考えに本当に感謝しています. また、光を当てる可能性のある情報をさらに提供できる場合は、お知らせください。

編集 これはより一般的な質問かもしれないと思いましたが、mplungjan への回答として、以下のカスタム ソーターを追加しました。並べ替えは、オブジェクトのフラット リストの形式の階層データセット用です。各オブジェクトには、次のような ID があります。ルート 1 の場合は 0。最初の子の場合は 0-0。2 番目の子の場合は 0-1。等

リスト内の各オブジェクトには、その親の 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 に答える