0

HTMLリストがあります

<select>
  <option value="w" count="1">w (1)</option>
  <option value="a" count="1">a (1)</option>
  <option value="d" count="5">d (5)</option>
  <option value="r" count="0">r (0)</option>
  <option value="q" count="0">q (0)</option>
  <option value="s" count="0">s (0)</option>
  <option value="b" count="5">b (5)</option>
</select>

countリストを最初に、次に。の順に並べたいvalue

出力:

<select>  
  <option value="b" count="5">b (5)</option>
  <option value="d" count="5">d (5)</option>
  <option value="a" count="1">a (1)</option>
  <option value="w" count="1">w (1)</option>
  <option value="q" count="0">q (0)</option>
  <option value="r" count="0">r (0)</option>
  <option value="s" count="0">s (0)</option>
</select>

countORで並べ替える方法は知ってvalueいますが、それらを組み合わせる簡単な方法が見つかりません。

カウントで並べ替え:

select.sort(function (a, b) {
    var c1 = parseInt($(a).attr('count'), 10);
    var c2 = parseInt($(b).attr('count'), 10);
    return c1 < c2 ? 1 : c1 > c2 ? -1 : 0;
});

そして価値によって

select.sort(function (a, b) {
    return $(a).text().toUpperCase().localeCompare($(b).text());
});

私はオブジェクトを構築することを考えています:

var map = {
    5: ['d', 'b'],
    1: ['a', 'w'],
    0: ['r', 'q', 's']
};

次に、各キーを並べ替えます。

function keys(map) {
    var keys = [];
    for (var key in map) {
        if (map.hasOwnProperty(key)) map[key].sort();
    }
    return keys;
}

keys(map);
map;

そして最後にselectリストを再構築します。

もっと簡単な方法はありますか?

4

2 に答える 2

1

これを試して:

select.sort(function (a, b) {
    var c1 = parseInt($(a).attr('count'), 10);
    var c2 = parseInt($(b).attr('count'), 10);

    if(c1 === c2){ // If the counts are equal, return the comparison for value.
        return $(a).text().toUpperCase().localeCompare($(b).text());
    }
    // Otherwise, compare the counts.
    // (With numbers, you can just substract `b` from `a` in sort functions.)
    return c1 - c2;
});

コメントを削除すると、わずか6行のコードになります。

にはステートメントが含まれているため、sort関数はifを評価しないため、2番目returnをaでラップする必要はありません。elseelsec1 === c2ifreturn

ここで、関数は、が。より小さいか、等しいか、大きいかに応じて、返されることをsort期待X<0, X=0 or X>0します(出力はどこにありますか) 。から引くと、必要な値が得られます。Xabba

于 2013-01-28T13:41:15.530 に答える
1

両方の機能を次のように組み合わせてみませんか。

select.sort(function (a, b) {
    var c1 = parseInt($(a).attr('count'), 10);
    var c2 = parseInt($(b).attr('count'), 10);

    if ( c1 == c2 ) {
      return $(a).text().toUpperCase().localeCompare($(b).text());
    } else {
      return c1 < c2 ? 1 : -1;
    }
});
于 2013-01-28T13:41:20.457 に答える