2016-10-12 11 views
3

私は以下に列挙したようなデザインのオブジェクトの配列を持っています。この配列をまずClassName(アルファベット順)、次にStartDateでソートしたいと思いますが、最初のソートを保持します。私はこれを達成するためにsort()を使用する可能性があると理解していますが、元の配列をより小さなグループに分割して初期ソートを保持する方法はわかりません。複数のクラスがあった場合、最終的なソートは、このような何かを探して終わるだろう、明確にするためオブジェクト配列のコンパイルソート(順序付け)

var objArray = [ 
    { 
     ClassName: "Excel", 
     Location: "Kansas City", 
     StartDate: "2/1/2016", 
     EndDate: "6/2/2016," 
    }, 
    { 
     ClassName: "Excel", 
     Location: "Kansas City", 
     StartDate: "3/1/2016", 
     EndDate: "7/2/2016," 
    }, 
    { 
     ClassName: "Outlook", 
     Location: "Kansas City", 
     StartDate: "1/1/2016", 
     EndDate: "5/2/2016," 
    } 
]; 

と再び:私はこのようなものに終わるだろうと上に理想的データに基づいて

var objArray = [ 
    { 
     ClassName: "Excel", 
     Location: "Kansas City", 
     StartDate: "2/1/2016", 
     EndDate: "6/2/2016," 
    }, 
    { 
     ClassName: "Outlook", 
     Location: "Kansas City", 
     StartDate: "1/1/2016", 
     EndDate: "5/2/2016," 
    }, 
    { 
     ClassName: "Excel", 
     Location: "Kansas City", 
     StartDate: "3/1/2016", 
     EndDate: "7/2/2016," 
    } 
]; 

Excel (1/1/2016) 
Excel (1/2/2016) 
Excel (2/3/2016) 
Outlook (1/3/2016) 
Outlook (2/3/2016) 
Word (1/1/2016) 
Word (5/5/2016) 
+2

あなたは「元のソートを保持する」と言うとき、あなたは[安定ソート](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)を意味ですか? – slezica

+0

@Emedリンクをありがとう、これは私の仕事の解決策を見つけるのを助けた。私は解決策がなければならない他の場所を知っていました。私はちょうど正しい検索語を見つけることができませんでした。 –

答えて

2

ような何かを探しているが、興味深いソリューションを持っていました。

私は地図上でやっているのでパフォーマンスが良いと思います。

私はやや修正したバージョンを実行しましたが、私は逆ソートを行うこともできました。今後の参考のために

var objArray = [ 
 
    { 
 
     ClassName: "Excel", 
 
     Location: "Kansas City", 
 
     StartDate: "2/1/2016", 
 
     EndDate: "6/2/2016," 
 
    }, 
 
    { 
 
     ClassName: "Outlook", 
 
     Location: "Kansas City", 
 
     StartDate: "1/1/2016", 
 
     EndDate: "5/2/2016," 
 
    }, 
 
    { 
 
     ClassName: "Excel", 
 
     Location: "Kansas City", 
 
     StartDate: "3/1/2016", 
 
     EndDate: "7/2/2016," 
 
    } 
 
]; 
 

 
objArray.sort(fieldSorter(['ClassName', 'StartDate'])); 
 
console.log(objArray); 
 

 
function fieldSorter(fields) { 
 
    var maps = []; 
 
    fields.map(function (o) { 
 
     var dir = +1; 
 
     if (o[0] === '-') { 
 
      dir = -1; 
 
      o=o.substring(1); 
 
     } 
 
     maps.push({fn:o, dir:dir}); 
 
    }); 
 
    return function (a, b) { 
 
     var ret = 0; 
 
     maps.some(function (o) { 
 
     if (a[o.fn] > b[o.fn]) ret = o.dir; 
 
     else if (a[o.fn] < b[o.fn]) ret = -o.dir; 
 
     else ret = 0; 
 
     return ret !== 0; 
 
     }); 
 
     return ret; 
 
    }; 
 
}

0

array.sort()は問題が発生している場所で問題なく動作しています。

console.log(JSON.stringify(objArray.sort()));

またはリンクが可能重複のために指摘@emedこの

objArray.sort(function(a, b) { 
    var classA = a.ClassName.toLowerCase(), classB = b.ClassName.toLowerCase(); 
    if(classA<classB){ 
     return -1;} 
    if(classA>classB){ 
     return 1;} 
    return 0; 
}); 

objArray.sort(function(a, b) { 

    var classA = a.ClassName.toLowerCase(), classB = b.ClassName.toLowerCase(); 
    if(classA===classB){ 
      var startA =new Date(a.StartDate), startB=new Date(b.StartDate); 
      return startA-startB; 
    } 
    return 0; 
}); 
+0

しかし、ソート方法を指定せずに 'objArray.sort()'と言うだけでいいとは思いません。 – Teepeemm

0

:これは私が問題を解決するために使用してしまった機能です。ご入力ありがとうございました:

function fieldSorter(fields) { 
    return function (a, b) { 
     return fields 
      .map(function (o) { 
       var dir = 1; 
       if (o[0] === '-') { 
        dir = -1; 
        o=o.substring(1); 
       } 
       if (a[o] > b[o]) return dir; 
       if (a[o] < b[o]) return -(dir); 
       return 0; 
      }) 
      .reduce(function firstNonZeroValue (p,n) { 
       return p ? p : n; 
      }, 0); 
    }; 
} 
関連する問題