Javascriptで配列データをサーバーの保存した後、読みだして並び替えをしたいです。配列データは下記の通りです。

savedata =[ date2,date1, user, title, 100-calc, category] //データを配列に入れる
これをWEBサーバーのCSVのファイルに保存しています。その後、
>||
//CSVファイルから過去の履歴データを読み取る
var rirekidata =[];
d3.text([parafilename1], function(text) {
rirekidata = d3.csv.parseRows(text);
console.log(rirekidata);
});
||<
このようにしてサーバーからCSVデータを読み込んで配列に入れています。
そして、下記のように100-calcの点数の配列の部分を降順に並び替えをしたいのですが
並び替えがうまくいきません。
もしかしたら、サーバーのCSVのファイルから配列データを読みだしたあと、配列の4番目の100-calcの
部分が数字ではなく文字になってしまったのでしょうか?配列データが文字列なのか、数字なのか調べる方法がわからず、難儀しております。原因をアドバイス頂けたら幸いです。

>||
// 全員のデータから得点のある配列の順番を入れ替えて、降順に並べ替える

rirekidata.sort(function(a, b) {
if (a[4] > b[4]) {
return -1;
} else if (a[4] < b[4]) {
return 1;
}
return 0;
});
||<

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2015/11/26 11:49:17

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ある変数に入ってるのが文字か数値かを調べるには、typeof 演算子を使います。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof

var v = ...

if (typeof v == "string") {
    // v は、文字列
} else if (typeof v == "number") {
    // v は、数値
} else {
    // v は、文字列でも数値でもない
}


d3.csv は、CSV を全て文字列でパースするんですね。
sort に指定する callback を以下のようにしてみてください。

rirekidata.sort(function(a, b) {
    var va = parseInt(a[4]), vb = parseInt(b[4]);   // parseInt で文字列を数値にする
    if (va > vb) {
        return -1;
    } else if (va < vb) {
        return 1;
    }
    return 0;
});
他1件のコメントを見る
id:a-kuma3

今回の件とはあまり関係がありませんが、比較用の関数を渡さないときの Array.sort は、たとえ数値が入っていても文字列にして辞書順で並べ替えるという謎仕様。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

var data = [80, 50, 0, 100, 0, 98];
data.sort();
console.log(data);

結果はこう。

Array [ 0, 0, 100, 50, 80, 98 ]

はまったことがあるのは、内緒です :-)

2015/11/25 18:51:53
id:kajironpu

そうなのですか、、数字は数字なのに、文字と数字くらい、自動で区別してくれないなんて!
ありがとうございます!

2015/11/26 11:49:08
  • id:a-kuma3
    サーバに保存してある CSV ファイルをテキストエディタで開いてみてください。
    カンマ区切りの 5番目(点数)は、数字ではなく NaN となっているのではないでしょうか。
  • id:kajironpu
    ありがとうございます。確認しましたがEXCELでもTXTエディタで開いてもちゃんと数字になっていました。
    得点の降順に並び替えを行った後、配列をユーザーごとに重複を削除しているのですが、
    一応、ユーザーごとの重複はうまく削除されておりました。ただ、全体の得点の順番がおかしいようです。
    例)
    2015/11/25 16:40 2015/11/25 鈴木 UNIT1 80 並べ替え
    2015/11/25 16:40 2015/11/25 鈴木 UNIT1 50 並べ替え
    2015/11/25 16:41 2015/11/25 田中 UNIT1 0 並べ替え
    2015/11/25 16:41 2015/11/25 田中 UNIT1 100 並べ替え
    2015/11/25 16:42 2015/11/25 山田 UNIT1 0 並べ替え
    2015/11/25 16:42 2015/11/25 山田 UNIT1 98 並べ替え


    この実際の並び替えの順番は、
    1位 山田 98点
    2位 鈴木 80点
    3位 田中 100点
    このようになっております。
    ※ 以前、webstorageからデータを読み込んで並び替えを行った時はうまくいったのですが、、、
  • id:a-kuma3
    ああ、それで数字か、という質問か。
    ようやく追いつきました :-)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません