2012-03-20 13 views
1

オブジェクトを順序付けするには、スコープのプロパティであるネストされたオブジェクトのプロパティを使用して昇順に並べ替えます。オブジェクトの解析されたJSデータをネストされたオブジェクトのプロパティで並べ替える方法

配列。

[ {name:'dan', score:220}, 
    {name:'lucy', score:876}, 
    {name:'mike', score:211} ] 

私は次のスレッドを見つけましたが、まだそれを動作させることができました。

How to sort a JavaScript array of objects by nested object property?

コンソール出力は不定。

function order_top_scores(prop, arr) { 
    arr.sort(function (a, b) { 
     if (a[prop] < b[prop]) { 
     return -1; 
     } else if (a[prop] > b[prop]) { 
     return 1; 
     } else { 
     return 0; 
     } 
    }); 
}; 

function get_results(){ 
    $.get(wp_theme_dir+'/dottodot.php', 
     function(data){ 
     var returnedData = $.parseJSON(data); 
     var ordered_scores = order_top_scores(returnedData)  
     console.log(returnedData); 

    }); 
} 

My Arrayはわずかに異なりますが、並べ替えを中断する2番目のプロパティになる可能性がありますか? または、私はajaxリクエストからデータを処理している方法かもしれません。事前に

おかげで、 カム

+0

機能の署名を確認してください。それは2つのパラメータを期待して –

+0

私は例を簡素化したときに見落としていた、まだ未定義thoを出力します。 – Cam

答えて

2

元気?

私はこれをテストしましたが、変更したいことがいくつかあります。この機能を分析

 var order_top_scores = function (prop, arr,reverse) { 
      if(!reverse) reverse = 0; 
      prop = prop.split('.'); 
      var len = prop.length; 

      arr.sort(function (a, b) { 
       var i = 0; 
       while(i < len) { a = a[prop[i]]; b = b[prop[i]]; i++; } 
       if (a < b) { 
        return -1; 
       } else if (a > b) { 
        return 1; 
       } else { 
        return 0; 
       } 
      }); 

      if(reverse){arr.reverse()}; 
      return arr; 
     }; 

:あなたが最初のように、あなたのorder_top_scoresを書き換える必要があるので、あなたは、尋ねた人ではなく、実際の溶液から「ソート」ソリューションを使用しているすべての

ファースト真と偽のいずれかを期待する第3の「逆」パラメータを追加しました(元のソリューションではそれが最も低いものから高いものに変わるため、逆の場合があります)。

これで、あなたが念頭に置いておきたい2つのことがあります:

まずこのラインで

var ordered_scores = order_top_scores(returnedData); 

あなたが実際にあなたがオブジェクトが順にソートするプロパティ機能を告げる最初の必須パラメータを、送信されていません。この場合は、「スコア」。あなたはそれがハイからローにソートする場合は、このように、

var ordered_scores = order_top_scores('score',returnedData); 

そして:

だから、あなたはこのように関数を呼び出す必要があり

var ordered_scores = order_top_scores('score',returnedData,true); 

を第二

また、ordered_scores値ではなく "returnedData"値を出力することに注意してください。次の行がある場合は

console.log(returnedData); 

出力が未定義であるということは、JSONデータが正しくないことを意味します。並べ替えが確実に行われるように、次のようなordered_scoresも出力する必要があります。

console.log(ordered_scores); 

不明な点があれば教えてください。

乾杯!

+0

ありがとうfsodano、これは完全に働いた。昇順/降順のブール値は素敵です。 – Cam

+0

うれしかった!楽しむ :) – fsodano

0

私は、これは正しいコードであることを確認していない:あなたが言及したようreturnedDataが配列の場合、次のorder_top_scoresの変化やメソッドの呼び出しが正常に動作して

var returnedData = $.parseJSON(data); 
var ordered_scores = order_top_scores(returnedData) 

あなたの質問に:

function get_results(){ 
    $.get(wp_theme_dir+'/dottodot.php', 
     function(data){ 
     var returnedData = $.parseJSON(data); 
     var ordered_scores = order_top_scores("score", returnedData); 
     console.log(returnedData); 

    }); 
} 

function order_top_scores(prop, arr) { 
    arr.sort(function (a, b) { 
      if (a[prop] < b[prop]) { 
      return -1; 
      } else if (a[prop] > b[prop]) { 
      return 1; 
      } else { 
      return 0; 
      } 
     }); 
} 

あなたには、出力hereを確認することができますコンソール

関連する問題