123

実際の問題については、最後の編集を参照してください。

わかりました、私はこのシナリオを持っています:

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

次に、これを行うと:

a.sort(function(a,b){return !a && b});

それは私にこれを与えます:

[false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

ある種のソートを行っています...しかし、完全ではありません... :(

この配列をソートするにはどうすればよいですか?

編集:

なぜ a.sort() だけを使用しなかったのか疑問に思われる場合は、実際の配列がオブジェクトの配列であり、投稿したような単純な配列ではないためです。本物には [{xx:true},{xx:false},...] のような要素があります

4

12 に答える 12

285

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
    
    
    a.sort(function(x, y) {
        // true values first
        return (x === y)? 0 : x? -1 : 1;
        // false values first
        // return (x === y)? 0 : x? 1 : -1;
    });
    
    console.log(a);

a と b の両方が同じ値の場合は 0 を返し、a が true の場合は -1 を返し、それ以外の場合は 1 を返す必要があります。

于 2013-06-30T05:26:16.887 に答える
48

暗黙的な型変換 (TypeScript のような言語が好まない) を防ぐためNumber()に、ブール値を数値に明示的に変換するために使用できます。

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort(function(x, y) {
   return Number(x) - Number(y);
});
console.log(a);

または矢印関数を使用します。

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort((x, y) => Number(x) - Number(y));
console.log(a);

于 2018-03-20T13:13:30.813 に答える
47

より簡単な方法:

a = [{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false}];

a.sort(function(a,b){return a.xx-b.xx});

console.log(a);

別の方法でソートしたい場合は、sort() の後に a.reverse() を呼び出すことができます。

編集:ブール値の配列ではなくオブジェクトの配列をソートするという更新された質問を反映するように編集されました。

于 2013-06-30T05:35:10.873 に答える
3

PFB ソリューションは、Typescript Angular 2 でも機能しました。

  let a = [{aa:"1",xx:true},{aa:"10",xx:false},{aa:"2",xx:true},{aa:"11",xx:false},{aa:"3",xx:true},{aa:"12",xx:false},{aa:"4",xx:true},{aa:"13",xx:false},{aa:"5",xx:true},{aa:"14",xx:false},{aa:"6",xx:true},{aa:"15",xx:false},{aa:"7",xx:true},{aa:"16",xx:false},{aa:"8",xx:true},{aa:"17",xx:false},{aa:"9",xx:true},{aa:"18",xx:false}];

    //a.sort(function(a,b){return a.xx-b.xx});
    a.sort(function (x, y) {
        // true values first
        return (x.xx === y.xx) ? 0 : x ? -1 : 1;
        // false values first
        // return (x === y)? 0 : x? 1 : -1;
    });
    return JSON.stringify(a);
于 2017-05-16T12:20:03.923 に答える
2

? :楽しみのために、演算子を使用せずにそれができるかどうかを確認したかったのです。

ノート

これは、生のブール値だけでなく、すべてのソート可能なデータ型 (文字列、数値) で機能します。? :これがより高速で、より複雑であるかどうかはわかりません。条件にうんざりしているだけなので、個人的な好みです。

  var b = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
  .sort((a,b) => Number(a > b) * 2 - 1);

これをユーティリティ関数に変換して、意味のある名前を付けることができます。

  var sortOrder = {
    asc: (a,b) => Number(a > b) * 2 - 1,
    desc: (a,b) => Number(a < b) * 2 - 1
  }

だから私はできる:

  var b = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
  .sort(sortOrder.asc);
于 2020-05-10T18:58:15.763 に答える