可能性のある複製:
JavaScriptのフィールド値による配列内のオブジェクトのソート
オブジェクトの配列を(IDで)数値的に、次に(名前で)アルファベット順にソートするにはどうすればよいですか?
現在の方法は無効な出力を提供しています。
これは私がソートしようとしているオブジェクトです
var items = [
{
"id": 165,
"name": "a"
},
{
"id": 236,
"name": "c"
},
{
"id": 376,
"name": "b"
},
{
"id": 253,
"name": "f"
},
{
"id": 235,
"name": "e"
},
{
"id": 24,
"name": "d"
},
{
"id": 26,
"name": "d"
}
]
そして、私がソートしようとしている方法
items.sort(function(a, b) {
return (a.id - b.id);
}).sort(function(a, b) {
return (a.name - b.name);
});
これがjsfiddleです。
編集:混乱して申し訳ありませんが、私はしばらくの間、この問題にとても混乱しています。
私が達成しようとしているのは、最初に最高のIDでソートし、次にアルファベット順にソートして、最終的に次のようにすることです:
var items = [
{
"id": 376,
"name": "b"
},
{
"id": 253,
"name": "f"
},
{
"id": 236,
"name": "c"
},
{
"id": 235,
"name": "e"
},
{
"id": 165,
"name": "a"
},
{
"id": 26,
"name": "d"
},
{
"id": 24,
"name": "d"
}
]
私はそれだけで良くやったと思う...
_items.sort(function(a, b) {
return a.id - b.id || a.name.localeCompare(b.name);
});
_
2番目の並べ替えは基本的に最初の並べ替えを無効にするため、1回行う必要があります。 )
a.id - b.id || a.name.localeCompare(b.name)
式は最初にid
sを比較します。それらが等しい場合にのみ、名前を比較します(そしてこの比較の結果を返します)。
順序を逆にする必要がある場合は、位置を入れ替えます(_b.id - a.id
_など)-またはすべてを無効にします:
_items.sort(function(a, b) {
return - ( a.id - b.id || a.name.localeCompare(b.name) );
});
_
ここに JSFiddle があります(私のポイントを示すためにデータを少し単純化する必要があります)。
id
で並べ替えたい場合、およびid
が一致する場合、name
で並べ替えたい場合は、次を使用します。
items.sort(function(a, b) {
if (a.id !== b.id) {
return a.id - b.id
}
if (a.name === b.name) {
return 0;
}
return a.name > b.name ? 1 : -1;
});
それ以外の場合、質問は不明です。
必要に応じて並べ替える一般的な関数を作成します。以下のdynamicSort関数を確認してください
var items = [
{
"id": 165,
"name": "a"},
{
"id": 236,
"name": "b"},
{
"id": 376,
"name": "c"},
{
"id": 253,
"name": "d"},
{
"id": 235,
"name": "e"},
{
"id": 24,
"name": "f"}
];
function dynamicSort(property) {
return function(a, b) {
return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
}
}
items.sort(dynamicSort('name')).sort(dynamicSort('id'));
console.log(items);
items.sort(dynamicSort('id')).sort(dynamicSort('name'));
console.log(items);
あなたの問題は、あなたがどのように手紙を分類しているかです。a.name - b.name
あなたが思っていることをやっていない。字句順にそれらを評価するのではありません。に置き換える
a.name < b.name ? -1 : 1;
Chromeでエラーは表示されませんが、正しくソートされていません。
ソートコードをこれに変更すると:
var firstRun = items.sort(function(a, b) {
return (a.id - b.id);
});
var secondRun = firstRun.sort(function(a, b) {
return (a.name - b.name);
});
console.log(secondRun);
正しくソートされていると思います。あなたの例では、各番号(id)が異なるため、実際に2番目のソートを行う必要はありません。しかし、b、d、eのIDをすべて235にすると、うまくソートされます。