1448507045 配列操作について教えて下さい。

dataArray4 =
["2015/11/25 16:40:58","2015/11/25","鈴木","UNIT1","80"],
["2015/11/25 16:40:59","2015/11/25","鈴木","UNIT1","40"],
["2015/11/25 16:40:60","2015/11/25","鈴木","UNIT2","50"],
["2015/11/25 16:40:61","2015/11/25","鈴木","UNIT2","60"],
["2015/11/25 16:40:61","2015/11/25","鈴木","UNIT2","90"],

このような配列データをうまく並べ替え、配列の3番めにある「UNIT」ごとに行を作成、
4番目の点数を列のデータにして、テーブルを作成したいと考えております。
(添付JPG参照)

JSfiddleにサンプルを入れました。
https://jsfiddle.net/kajironpu/67njxhjv/
既存の配列で、1つ目と2つ目の3番目の「タイトル」がもし同じだったら、別の配列にpushしています。
このようなやり方で、全部別の配列に入れなおして、それをテーブル表示する方法を考えました。
並べ替え後は
["UNIT1","80","40"],["UNIT2,"50","60","90"]
のような形にしてテーブル表示させたい。

このようなやり方は正しいでしょうか? もっとスマートなやり方があれば是非教えて下さい。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2015/11/26 12:04:05
  • 終了:2015/11/30 11:31:25

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032015/11/26 13:23:35

質問の jsfiddle にあるコードだと、以下のような問題があります。

  • 集計結果が2次元の配列にならない
  • 4番目の UNIT* で元データが並び替えられてないと正しく動かない
  • 細かいところ
    • ループの最後にエリア外を参照
    • dataArray4 の初期化が正しくない

スマートなやり方かどうかは分かりませんが、UNIT* 毎にデータを集計したいのであれば、連想配列を使うのが良いと思います。

dataArray4 =[
    ["2015/11/25 16:40:58","2015/11/25","鈴木","UNIT1","80"],
    ["2015/11/25 16:40:59","2015/11/25","鈴木","UNIT1","40"],
    ["2015/11/25 16:40:60","2015/11/25","鈴木","UNIT2","50"],
    ["2015/11/25 16:40:61","2015/11/25","鈴木","UNIT2","60"],
    ["2015/11/25 16:40:61","2015/11/25","鈴木","UNIT2","90"],
];

// データの集計
var tableMap = {};  // 連想配列(添え字が文字列)
for (var i=0; i<dataArray4.length; i++){
    var key = dataArray4[i][3];
    var rec = tableMap[key];
    if (! rec) {    // 最初は何も入ってない
        rec = [];
    }
    rec.push(dataArray4[i][4]);
    tableMap[key] = rec;
}

こうやって集計すると、例えば tableMap[ "UNIT2" ][ 1 ]60 になります。

一覧表を作るところも含めて jsfiddle にコードを置いてみました。
https://jsfiddle.net/a_kuma3/p50gb5o7/1/

他3件のコメントを見る
id:a-kuma3

// rec = tableMap[ "UNIT2" ] (= null) 
このnull(空っぽ?)の意味は、UNIT2がはじめて登場してきたという意味なのでしょうか?

そうです。
i = 2 の時点では、tableMap にはキーが "UNIT1" のデータしか入っていないので、"UNIT2" で取り出すと null が取り出されます。

つまり、配列にプッシュするには、最初は空の配列を用意しておく必要があるので
あたらしいkeyが出て来たときの判定用ですか?

そうです。

最初に空の配列を全てセットしておく、という手もあります。

var tableMap = {};  // 連想配列(添え字が文字列)

// 最初に空の配列を設定しておく
for (var i=0; i<dataArray4.length; i++){
    var key = dataArray4[i][3];
    tableMap[key] = [];
}

// データを集計する
for (var i=0; i<dataArray4.length; i++){
    var key = dataArray4[i][3];
    var rec = tableMap[key];
    rec.push(dataArray4[i][4]);     // rec は Array だと保証されている
    tableMap[key] = rec;
}

分かりやすいように、やや冗長に書いています。
もっと短く書くと、こんな風に書けます。

var tableMap = {};  // 連想配列(添え字が文字列)

// 最初に空の配列を設定しておく
dataArray4.forEach(function(rec) {
    tableMap[rec[3]] = [];
});

// データを集計する
dataArray4.forEach(function(rec) {
    tableMap[rec[3]].push(rec[4]);
});
2015/11/26 16:01:41
id:kajironpu

なるほど、とても勉強になります。
ありがとうございます。
2番目の空の配列を用意しておくやり方が分かりやすいです。
どうもありがとうございました。

2015/11/26 16:24:25

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません