2016-09-29 10 views
0

のソート私は配列を持っている:デフォルト.sortを使用してJavaScriptで必要な配列オブジェクト()

var array = [ 
{ID : 1, 
Name : one, 
data : {more info here} 
}, 
{ID : 2, 
Name : two 
}, 
{ID : 3, 
Name : three, 
data : {more info here} 
}, 
{ID : 4, 
Name : four 
}, 
{ID : 5, 
Name : five, 
data : {more info here} 
},] 

データは、他の、トップになる存在であるこれらの配列を、ソートする必要があります。 最終ソート結果は次のようになります -

[{ID:1,name: one,data: {}}, 
{ID:3,name: three,data: {}}, 
{ID:5,name: five,data: {}}, 
{ID:2,name: two}, 
{ID:4,name: four}] 
+0

あなたが実際にあなたがすべて、 'ID'の昇順にソートdata'最初'を持つすべてのものをしたいという意味ですか「データが存在する場合には、他の、その後、トップになります」 'データ'のないものも 'ID 'の順番でソートされていますか? – Makyen

+0

ところで、入力配列をランダムに並べ替えた方が良いでしょう。つまり、答えの中には、配列の入力順に依存して、出力として指定した配列全体の順序で終わるものがあります。あなたが心配するのは、 'data'を持っているすべての人が' data'を持たない人よりも前でなければならないということです。言い換えれば、 'ID'が' [5,1,3,4,2] 'の順番であれば配列結果がOKであれば、これは問題ではないでしょうか? – Makyen

+0

注:あなたの質問は、結果の配列も 'ID'でソートする必要があるかどうかを現在表示していないので、私は投票しました(つまり、あなたの質問はこれが当てはまるかもしれないが、 'data'の中で' ID'の順序を気にするかどうかを明確にした場合、 'data'サブグループを持たない場合、私は下位投票を削除します。これを明確にしたら、 '@ Makyen'をコメントに残しておいてください。 – Makyen

答えて

3

あなたがプロパティのboolen値の差分を使用することができます。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function (a, b) { 
 
    return !a.data - !b.data; 
 
}); 
 

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

キー上のストレスとの別のバージョンが存在するかどうかのチェックである可能性があります。

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function (a, b) { 
 
    return ('data' in b) - ('data' in a); 
 
}); 
 

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

+0

質問が必要かどうかは不明ですが、現在、要求されている出力配列の順番と一致するように入力配列の順序に依存しています。言い換えれば、あなたは 'data'の中でソートするために' ID'をチェックせず、 'data'グループも持っていません。つまり 'ID'でソートされた' data' /非 'data'グループのために' ID'でソートされている入力配列に依存しています。 – Makyen

+0

あなたが正しいです、結果は、指定された並べ替えのパラメータで安定していません。安定した値を得るためには、ソートのための別のパラメータを追加する必要があります。 –

0

希望ソートで唯一の問題は、data財産の存在または不存在であるかどうかは質問から明らかではありません。所望の「最終ソート結果」は、dataの有無によって最初にソートされたデータを示し、その後、これらのグループ内の昇順でIDの順にソートされたデータを示しています。 IDによる並べ替えは、単に開始配列の順序のアーティファクトに過ぎず、質問の必須部分ではない可能性があります。一方、dataと次にIDの両方でソートする必要があるかもしれません。

他の解決策のいずれかをソート全くIDNina Scholz's answer)に基づいて、またはソートdataID両方によって、そのように誤って入力配列(Rajesh's answer)に依存しないでください。どちらも入力アレイの順序に依存して、目的の結果配列を提供します。

次のコードは、最初にdataの存在または不存在のもとで配列をソートし、次にその2つのサブグループ内でIDによって配列をソートします。元々提供された入力配列ソート

:以下

var array = [{ ID: 1, Name: 'one', data: {} }, { ID: 2, Name: 'two' }, { ID: 3, Name: 'three', data: {} }, { ID: 4, Name: 'four' }, { ID: 5, Name: 'five', data: {} }]; 
 

 
array.sort(function(a, b) { 
 
    if(a.data && !b.data) { 
 
    // a has data, b does not have data, a is first 
 
    return -1; 
 
    } 
 
    if(!a.data && b.data) { 
 
    // a does not have data, b does have data, b is first 
 
    return 1; 
 
    } 
 
    // a and b either both have data, or both don't have data. Sort the smaller ID first. 
 
    return a.ID - b.ID; 
 
}); 
 
console.log(array)

が若干Rajesh's updated answerで使用されるものから修正された入力配列で始まる同じ種類です。その答えの配列がID:4,からID:41,に変更されました。その変更された入力配列では、Rajeshのソートは誤った結果を生成します。このコードは、dataIDの両方で正しく並べ替えます。

var array=[{ID:1,Name:"one",data:{"more info here":"something"}},{ID:2,Name:"two"},{ID:30,Name:"Thirty",data:{"more info here":"something"}},{ID:41,Name:"four"},{ID:5,Name:"five",data:{"more info here":"something"}},{ID:40,Name:"fourty",data:{"more info here":"something"}},{ID:300,Name:"threeHundred",data:{"more info here":"something"}},{ID:20,Name:"twenty"},{ID:3e3,Name:"threeThousand",data:{"more info here":"something"}}]; 
 

 
array.sort(function(a, b) { 
 
    if(a.data && !b.data) { 
 
    // a has data, b does not have data, a is first 
 
    return -1; 
 
    } 
 
    if(!a.data && b.data) { 
 
    // a does not have data, b does have data, b is first 
 
    return 1; 
 
    } 
 
    // a and b either both have data, or both don't have data. Sort the smaller ID first. 
 
    return a.ID - b.ID; 
 
}); 
 
console.log(array)

関連する問題