プロが教えるわが家の防犯対策術!

javascriptで配列を使ってテーブルデータのソートをしたいです。

[
{"t":"a", "n":1},
{"t":"b", "n":1},
{"t":"a", "n":2},
{"t":"a", "n":3},
{"t":"b", "n":2}
]
上記をソートして下記の様にしたいです。
{"t":"a", "n":1},
{"t":"a", "n":2},
{"t":"a", "n":3},
{"t":"b", "n":1},
{"t":"b", "n":2}
]

以下の様に書いてみました。

<html>
<head>
<SCRIPT LANGUAGE='JavaScript1.2'><!--
var list1 = [
{"t":"a", "n":1},
{"t":"b", "n":1},
{"t":"a", "n":2},
{"t":"a", "n":3},
{"t":"b", "n":2}
];
list1.sort(function(a, b) {return a.t-b.t||a.n-b.n});
var text1="";
for(var i=0; i<list1.length; i++) {
text1 += "<br>" + list1[i].t + " " + list1[i].n;
}
function init(){
document.getElementById("o").innerHTML = text1;
}
//--></script>
</head>
<body onload="init()">
<div id="o"></dev>
</div>
</html>

実行すると下記の様に表示されました。

a 1
b 1
a 2
b 2
a 3

期待してる結果は以下です。

a 1
a 2
a 3
b 1
b 2

なにが悪いのでしょうか?

因みに、テーブルデータが以下の様に数値だけのの場合、
var list1 = [
{"t":1, "n":1},
{"t":2, "n":1},
{"t":1, "n":2},
{"t":1, "n":3},
{"t":2, "n":2}
];

実行結果は

1 1
1 2
1 3
2 1
2 2

の様になりました。

数値の場合、
list1.sort(function(a, b) {return a.t-b.t||a.n-b.n});
の式で問題ないのでしょうが、
文字列の場合、この式ではダメなんだろうなと考えてます。

以上、よろしくお願いいたします。

A 回答 (3件)

しまった、きちんと検証してませんでした。


以下でうまくいくと思います。

list1.sort(function(a, b){return (a.t==b.t)?(a.n>b.n?1:-1):(a.t>b.t?1:-1);});
    • good
    • 0
この回答へのお礼

yambejpさん
ご回答ありがとうございました。

期待した結果が得られました。

お礼日時:2008/12/11 23:54

"a"-"b" の結果を確認してみましたか?


確認してみればこれでは比較できないことが分かると思います。

JavaScriptでは不等号で文字列の辞書順比較ができるので
横着せずに不等号で比較しましょう。
if文を使うなどして、
第1引数が第2引数より小さい(第1引数の方を前に並べたい)場合は負数、
同じ場合は0、
第1引数が第2引数より大きい場合は正数を返すようにするだけです。

この回答への補足

ご回答ありがとうございます。

list1.sort(function(a, b) {return (a.t > b.t) ? 1:-1||a.n -b.n});

としてみましたが、

a 2
a 3
a 1
b 2
b 1

となり、期待した結果が得られませんでした。

a 1
a 2
a 3
b 1
b 2

が期待してる結果です。

実は、
return (a.t > b.t) ? 1:-1||a.n -b.n
と書いていますが、||の意味がよく解ってません。

補足日時:2008/12/11 22:31
    • good
    • 0

>list1.sort(function(a, b) {return a.t-b.t||a.n-b.n});



これって文字列を引き算してませんか?
文字列の比較も不等号がつかえるのでこうしてみては?

list1.sort(function(a, b) {return a.t > b.t||a.n >b.n});

この回答への補足

ご回答ありがとうございます。

list1.sort(function(a, b) {return a.t > b.t||a.n >b.n});

としてみましたが、結果は

a 2
b 1
a 3
a 1
b 2

となり、期待した結果は得られませんでした。

補足日時:2008/12/11 21:59
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!