2016-07-20 4 views
0

以下にコピーされる関数は、最初にパラメータ1、次に2でzオブジェクトをソートすることです。オブジェクトパラメータが非一意ではない整数の重複オブジェクトインスタンスを返します。この機能について根本的に間違っているのは何ですか? if(s)の後にはreturn 0;で動作しません。 ありがとう!より詳細にdouble sortは重複を返します

z=[{object1},{object2},{object3},...,{objectN}]; 
z.sort(function(x,y){ 
    if(x.param1-y.param1>0){return -1}; 
    if(x.param1-y.param1<0){return 1}; 
    if(x.param1-y.param1==0){ 
     if(x.param2-y.param2>0){return -1}; 
     if(x.param2-y.param2<0){return 1}; 
    }; 

}); 

zは次のようになります

z=[{"level":0,"order":0,"t":"section","a":{"class":"ro s-14 m-3"}}, 
    {"level":1,"order":0,"t":"h1","a":{"class":"tx-1 s-35"},"x":"This is a text"}, 
    {"level":1,"order":1,"t":"div","a":{"class":"tx-0 m-3"}}, 
     {"level":2,"order":0,"t":"h2","a":{"class":"tx-0 s-18"},"x":"This is a text"}, 
     {"level":2,"order":1,"t":"h3","a":{"class":"tx-0 s-14 fw-3"}}, 
      {"level":3,"order":0,"t":"li","x":"This is a text"}, 
      {"level":3,"order":1,"t":"li","x":"This is a text"}, 
      {"level":3,"order":2,"t":"li","x":"This is a text"}, 
      {"level":3,"order":3,"t":"li","x":"This is a text"}, 
      {"level":3,"order":4,"t":"li","x":"This is a text"}, 
      {"level":3,"order":5,"t":"li","x":"This is a text"}, 
      {"level":3,"order":6,"t":"li","x":"This is a text"}, 
      {"level":3,"order":7,"t":"li","x":"This is a text"}, 
      {"level":3,"order":8,"t":"li","x":"This is a text"}, 
     {"level":2,"order":2,"t":"h4","x":"This is a text"}, 
    {"level":1,"order":2,"t":"div","a":{"class":"tx-0 m-3"}}, 
     {"level":2,"order":0,"t":"h2","x":"This is a text"}, 
     {"level":2,"order":1,"t":"h3","a":{"class":"tx-0 s-12 fw-3"}}, 
      {"level":3,"order":0,"t":"li","x":"This is a text"}, 
      {"level":3,"order":1,"t":"li","x":"This is a text"}, 
      {"level":3,"order":2,"t":"li","x":"This is a text"}, 
      {"level":3,"order":3,"t":"li","x":"This is a text"}, 
      {"level":3,"order":4,"t":"li","x":"This is a text"}, 
      {"level":3,"order":5,"t":"li","x":"This is a text"}, 
      {"level":3,"order":6,"t":"li","x":"This is a text"}, 
      {"level":3,"order":7,"t":"li","x":"This is a text"}, 
      {"level":3,"order":8,"t":"li","x":"This is a text"}, 
      {"level":3,"order":9,"t":"li","x":"This is a text"}, 
      {"level":3,"order":10,"t":"li","x":"This is a text"}, 
      {"level":3,"order":11,"t":"li","x":"This is a text"}, 
     {"level":2,"order":2,"t":"h4","x":"This is a text"}, 
]; 
+1

あなたの最初の二つのIFS、そして最後の内側の2つのIFSブロックは同じを使用している場合異なる値を返します。私はあなたが '<'比較より小さい値をとることを意味すると思っています。 –

+0

オブジェクトの実データを追加してください。 –

+1

@PatrickEvansによれば、各グループの2番目の '> 'を' <'に変更する必要があります。また、最後に 'return 0'が必要です。ところで、 '== 0'をテストする必要はありません。それが0よりも小さくない場合、それは残りの可能性です。 – Barmar

答えて

0

あなたの実装の問題がparam1param2あなたが正しくない異なる戻り値であれば同じことをやって、両方のためのものです。あなたの補正は次のようになります。

z = [ { object1 }, { object2 }, { object3 },...,{ objectN }]; 
z.sort(function(x,y){ 
    if(x.param1-y.param1>0){return -1}; 
    if(x.param1-y.param1<0){return 1}; 
    if(x.param1-y.param1==0){ 
     if(x.param2-y.param2>0){return -1}; 
     if(x.param2-y.param2<0){return 1}; 
    }; 

}); 

ところで、私はあなたが何をしたかよりも、この多くを好む:

var items = [{ p1: 10, p2: 3 }, { p1: 9, p2: 4 }, { p1: 9, p2: 3 }, { p1: 10, p2: 2 }, { p1: 11, p2: 3 }, ]; 
 

 
items.sort((a, b) => (a.p1 - b.p1) || (a.p2 - b.p2)); 
 

 
console.log(items);

あなたは値の違いを見ることができるようにその機能をソートする意味があります注文に使用する減算の結果を渡すことができます。 differenceが0(偽も意味する)であれば、2番目のparamに移動し、その減算の結果を返します。

0

あなたは昇順のためのよりコンパクトなコールバックを使用することができます。

z.sort(function (x, y) { 
    return x.param1 - y.param1 || x.param2 - y.param2; 
}); 

または降順:

z.sort(function (x, y) { 
    return y.param1 - x.param1 || y.param2 - x.param2; 
}); 
関連する問題