2016-06-23 22 views
1

私はすでに次を使用して名前のキーによって、これをソートしていますオブジェクトの配列にこのソートjavascriptの複数のキーで配列

var itemArray = [ 
    { 
     "name": "name1", 
     "flag": true, 
    }, 
    { 
     "name": "name1", 
     "flag": false, 
    }, 
    { 
     "name": "name2", 
     "flag": false, 
    }, 
    { 
     "name": "name3", 
     "flag": true, 
    }   
]; 

のようなものを持っています旗のアルファベット順に旗が表示されるので、真の旗の前に偽の旗が現れますか?

[ 
    { name: "name_a", flag: false }, 
    { name: "name_a", flag: true }, 
    { name: "name_b", flag: false }, 
    { name: "name_b", flag: true}, 
    { name: "name_c", flag: true}, 
    { name: "name_d", flag: false}, 
] 
+2

ロジックは単純です:あなたの比較関数には、まずあなたの主な比較を行い、これは*等しくない場合*、あなたはあなたの二次比較を行い、その結果を返す他に、比較結果を返します。 – deceze

+0

[Javascript、複数の列で配列をソートする方法は?](http://stackoverflow.com/questions/2784230/javascript-how-do-you-sort-an-array-on-multiple-columns) ) – Kld

答えて

2

VAR sortedItems = sortByKey(itemArray、 "名")。

function sortByKey(array, key) { 
    return array.sort(function(a, b) { 
     if(a[key] == b[key]) { 
      return (a['flag'] ? -1 : 1); 
     } else { 
      var x = a[key]; 
      var y = b[key]; 
      return x.localeCompare(y); 
     } 
}); 
+0

はい!間違いなく貴重な時間を費やしてくれてありがとう、エドゥアードを助けてくれてありがとう、本当に感謝しています。 – user2928010

+0

は私の喜びでした:D –

1
var sortedItems = sortByKey(itemArray, "name"); 

    function sortByKey(array, key) { 
     return array.sort(function(a, b) { 
      if(a['flag'] == f['flag']) { 
       var x = a[key]; 
       var y = b[key]; 
       return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
      } else { 
       return (a['flag'] ? -1 : 1); 
      } 
    }); 
:明確にするために

を(これは、それが簡単になる場合、私はフラグプロパティに代わり、ブールの文字列を使用することができます)、私は何を探していますと、例えば次のように返される配列であります

+0

これには何か問題があります。名前で完全にソートされるわけではありません。いくつかはアルファベット順ではありません。 – user2928010

+0

x.localeCompare(y)に変更((x y)?1:0)) –

+0

これは本当のフラグを持つすべての項目がアルファベット順であるリストを返しますアルファベット順の名前の偽のフラグを持つすべての項目が続きます。私が探しているのはソートされたリストで、リスト全体が名前のアルファベット順であり、フラグもアルファベット順にソートされています。例えば"{name:" name_a "、flag:false}、{name:" name_a "、flag:true}、{name:" name_b "、flag:false}、{name:" name_b "、flag:true} .. 。 – user2928010

1

適切なコールバックを使用して、最初にflag、次に等しい場合はnameでソートできます。

var itemArray = [{ "name": "name1", "flag": true, }, { "name": "name1", "flag": false, }, { "name": "name2", "flag": false, }, { "name": "name3", "flag": true, }]; 
 

 
itemArray.sort(function (a, b) { 
 
    return a.name.localeCompare(b.name) || a.flag - b.flag; 
 
}), 
 

 
console.log(itemArray);

+0

これはちょうどフラグキーで並べ替えられます – user2928010

+0

なぜそう思いますか? –

+0

実際には、スニペットの実行はフラグでのみソートされます。コードで実行すると、名前でソートされます。たとえば、次のデータを含むソートされた配列があります。 name: "some name"フラグ:true 、 名前:「some name」フラグ:false、 名前:「some name」フラグ:true – user2928010

関連する問題