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;
});
||<
ある変数に入ってるのが文字か数値かを調べるには、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; });
今回の件とはあまり関係がありませんが、比較用の関数を渡さないときの Array.sort は、たとえ数値が入っていても文字列にして辞書順で並べ替えるという謎仕様。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
結果はこう。
はまったことがあるのは、内緒です :-)
2015/11/25 18:51:53そうなのですか、、数字は数字なのに、文字と数字くらい、自動で区別してくれないなんて!
2015/11/26 11:49:08ありがとうございます!