3

次のようなオブジェクトの配列があります。

var a = [
    { id: 1, score: 1, isCut: false, dnf: false },
    { id: 2, score: 2, isCut: false, dnf: false },
    { id: 3, score: 3, isCut: false, dnf: false },
    { id: 4, score: 4, isCut: false, dnf: false },
    { id: 5, score: 5, isCut: true, dnf: true },
    { id: 6, score: 6, isCut: true, dnf: false },
    { id: 7, score: 7, isCut: true, dnf: false },
    { id: 8, score: 8, isCut: true, dnf: false },
    { id: 9, score: 9, isCut: true, dnf: false },
    { id: 10, score: 0, isCut: false, dnf: false },
    { id: 11, score: -1, isCut: false, dnf: false },
    { id: 12, score: -2, isCut: false, dnf: true },
    { id: 13, score: -3, isCut: false, dnf: false },
    { id: 14, score: -4, isCut: false, dnf: false },
    { id: 15, score: -5, isCut: false, dnf: false },
    { id: 16, score: 10, isCut: true, dnf: false }
];

次の基準で配列をグループ化して並べ替える必要があります。

  1. true の場合dnf、オブジェクトは一番下に移動します。すべてのdnfオブジェクトはスコアでソートする必要があります
  2. が true の場合isCut、オブジェクトは下に移動しますが、dnfs の上に移動します。すべてのisCutオブジェクトはスコアでソートする必要があります
  3. 残りは でソートする必要がscoreあり、スコアが等しい場合はid
4

3 に答える 3

0

Array のコンパレータ関数を使用する

ここで回答を確認できます:JavaScriptの文字列プロパティ値でオブジェクトの配列を並べ替えます

于 2013-07-30T09:30:04.893 に答える
0

これは別のアプローチであり、並べ替え順序に配列を使用します。これは、両方を見ずにdnfisCutプロパティを使用する場合、不規則です。真理値表に両方の値を使用すると、並べ替え順序は必要な順序を反映しません。

                   2*dnf+isCut
    dnf     isCut     value     order
--------  --------  --------  --------
     0         0         0         0
     0         1         1         1
     1         1         3         2
     1         0         2         3

ソート順を修正するには、配列を使用して正しい順序を取得することをお勧めします。

var data = [{ id: 1, score: 1, isCut: false, dnf: false }, { id: 2, score: 2, isCut: false, dnf: false }, { id: 3, score: 3, isCut: false, dnf: false }, { id: 4, score: 4, isCut: false, dnf: false }, { id: 5, score: 5, isCut: true, dnf: true }, { id: 6, score: 6, isCut: true, dnf: false }, { id: 7, score: 7, isCut: true, dnf: false }, { id: 8, score: 8, isCut: true, dnf: false }, { id: 9, score: 9, isCut: true, dnf: false }, { id: 10, score: 0, isCut: false, dnf: false }, { id: 11, score: -1, isCut: false, dnf: false }, { id: 12, score: -2, isCut: false, dnf: true }, { id: 13, score: -3, isCut: false, dnf: false }, { id: 14, score: -4, isCut: false, dnf: false }, { id: 15, score: -5, isCut: false, dnf: false }, { id: 16, score: 10, isCut: true, dnf: false }];

data.sort(function (a, b) {
    function order(dnf, isCut) { return [0, 1, 3, 2][dnf * 2 + isCut]; }

    return order(a.dnf, a.isCut) - order(b.dnf, b.isCut) || b.score - a.score;
});

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

于 2016-11-08T12:52:26.680 に答える