2013-10-08 31 views
6

私はいくつかのJSONのようにフォーマットされていること:ソートJSONはアルファベット順に

places =[ 
    { 
     "city":"Los Angeles", 
     "country":"USA", 
    }, 
    { 
     "city":"Boston", 
     "country":"USA", 
    }, 
    { 
     "city":"Chicago", 
     "country":"USA", 
    }, 
] 

エトセトラ...

私はこれを並べ替えるにしようとしていますアルファベット順にCITY BYと持っていますそうすることでトラブル。私は、私の問題の根本は、文字の順序(数字に対して)を決めるように思える。私は単純な試みをしました:

places.sort(function(a,b) { 
    return(a.city) - (b.customInfo.city); 
    }); 

まだ、この減算は何をすべきか分かりません。誰かが私を助けることができますか?

答えて

21

残念ながら、sort()に適切な値を返すために、JavaScriptには一般的な「比較」関数はありません。私は、比較演算子を使用して、それをソート関数で使用するcompareStrings関数を書くだろう。

function compareStrings(a, b) { 
    // Assuming you want case-insensitive comparison 
    a = a.toLowerCase(); 
    b = b.toLowerCase(); 

    return (a < b) ? -1 : (a > b) ? 1 : 0; 
} 

places.sort(function(a, b) { 
    return compareStrings(a.city, b.city); 
}) 
+0

神聖ながらくた、マッティは、私はあなたにビールを負っています。なぜ

+2

比較は '<'であり、友人は文字列の辞書順を使用するように定義されているため、比較が機能します。内部的には、一致する各文字をチェックし、2つの異なるUnicode値が見つかると、それが返され、結果として「辞書」の順序が決まります。これはまた、比較自体がコードポイント値のみを比較するため、ちょうどその場合にLOWCase()呼び出しを追加した理由です。大文字小文字はチェックされません。 –

4

Mattiのソリューションは正しいが、より簡単に書くことができます。追加の関数呼び出しは必要ありません。ロジックを直接sortコールバックに入れることができます。大文字と小文字を区別しソートするための

places.sort(function(a, b) { 
    a = a.city.toLowerCase(); 
    b = b.city.toLowerCase(); 

    return a < b ? -1 : a > b ? 1 : 0; 
}); 

:大文字と小文字を区別しないソートの場合

places.sort(function(a, b) { 
    return a.city < b.city ? -1 : a.city > b.city ? 1 : 0; 
}); 
関連する問題