3

.sort() 関数を使用して並べ替えたいオブジェクトの配列があります。3 つの値でソートされます (最初の値、次に 2 番目、最後に 3 番目の値)。次のようなことを試しましたが、正しく動作していないようです。

myArray.sort(function(a,b) {
     if (a.Value1 === b.Value1) {
         if (a.Value2 === b.Value2) {
             return (a.Value3 < b.Value3) ? -1 : (a.Value3 > b.Value3) ? 1 : 0;
         } else {
             return (a.Value2 < b.Value2) ? -1 : 1;
         }
     } else {
         if (a.Value2 === b.Value2) {
             return(a.Value1 < b.Value1) ? -1 : 1;
         } else {
             return (a.Value2 < b.Value2) ? -1 : 1;
         }
     }
 });

どんな助けでも大歓迎です。

4

4 に答える 4

2

ほとんどは良かったのですが、些細なケースでロジックを台無しにしましたa.Value1 !== b.Value1

修正版は次のとおりです。

myArray.sort(function(a,b) {
     if (a.Value1 === b.Value1) {
         if (a.Value2 === b.Value2) {
             return (a.Value3 < b.Value3) ? -1 : (a.Value3 > b.Value3) ? 1 : 0;
         } else {
             return (a.Value2 < b.Value2) ? -1 : 1;
         }
     } else {
          return (a.Value1 < b.Value1) ? -1 : 1;
     }
});

デモンストレーション

于 2012-12-11T12:55:25.717 に答える
1

なぜそんなに複雑なのですか?これを試して:

myArray.sort(function(a,b) {
    if(a.Value1 !== b.Value1) return (a.Value1 < b.Value1) ? -1 : 1;
    if(a.Value2 !== b.Value2) return (a.Value2 < b.Value2) ? -1 : 1;
    return (a.Value3 < b.Value3) ? -1 : 1;
    });
于 2012-12-11T13:06:09.010 に答える
0
myArray.sort(function(a,b) {

    function getResult(first, second) {
      return (first < second) ? -1  : (first > second) ? 1 : 0;
    }

    if (a.Value1 !== b.Value1) return getResult(a.Value1, b.Value1);
    if (a.Value2 !== b.Value2) return getResult(a.Value2, b.Value2);
    return getResult(a.Value3, b.Value3);

 });
于 2012-12-11T12:58:15.850 に答える
0

私にとって、これはより効率的で読みやすいです。一方、それは任意の数のフィールドで機能します

      List.sort(function (a, b) {
          var keyA = a.Field1;
          var keyB = b.Field1;

          if (keyA > keyB) return -1;
          if (keyA < keyB) return 1;

          keyA = a.Field2;
          keyB = b.Field2;

          if (keyA > keyB) return -1;
          if (keyA < keyB) return 1;

          keyA = a.Field3;
          keyB = b.Field3;

          if (keyA > keyB) return -1;
          if (keyA < keyB) return 1;

          //You can repeat this for any number of fields

          return 0;
      });
于 2016-04-26T20:20:48.220 に答える