人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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;
});
||<

●質問者: kajironpu
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
ベストアンサー

ある変数に入ってるのが文字か数値かを調べるには、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;
});

kajironpuさんのコメント
ありがとうございます。やっと謎が解けました。 データを読み込んだ時、やはり文字になってしまっていたんですね。 おかげさまでうまくできました。 どうもありがとうございました!

a-kuma3さんのコメント
今回の件とはあまり関係がありませんが、比較用の関数を渡さないときの Array.sort は、たとえ数値が入っていても文字列にして辞書順で並べ替えるという謎仕様。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort >|javascript| var data = [80, 50, 0, 100, 0, 98]; data.sort(); console.log(data); ||< 結果はこう。 >|| Array [ 0, 0, 100, 50, 80, 98 ] ||< はまったことがあるのは、内緒です <tt>:-)</tt>

kajironpuさんのコメント
そうなのですか、、数字は数字なのに、文字と数字くらい、自動で区別してくれないなんて! ありがとうございます!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ