質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1291閲覧

【JavaScript】連想配列をさらに配列に入れる

cookie1123

総合スコア8

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/11/13 08:36

###前提・実現したいこと
JavaScript初心者です。

JavaScriptとAjaxで、ローカルのCSVファイルを読み込もうとしています。
(CSVファイルは項目ごとにカンマ区切り、データごとに改行されています)
読み込んだテキストは、連想配列をさらに配列に入れた形式に変換しようとしています。

例)tourismList[{id:"1",name:"名前1",areaID:"エリア名1"・・・},{id:"2",name:"名前2",areaID:"エリア名2"・・・},・・・]

読み込んだテキストを連想配列に入れるところまではできたのですが、それをさらに配列に入れようとすると、配列の中身すべてが最終要素で上書きされて入ってしまいます。
document.getElementById("test").innerHTML += arrayT[i]['name']の段階ではきちんとすべての要素が出力できているので、arrayT[i]=tourismListItemのあたりが怪しいと思うのですが、いろいろ調べて試してみても改善できません。

似たような質問内容が過去にもあったのですが、そこでも解決できていないようでしたので改めて質問させていただきます。
修正方法ご存知の方、ご教示よろしくお願いいたします。

###該当のソースコード

javascript

1function csvToArray(path) { 2 var csvData = new Array(); 3 4 var data = new XMLHttpRequest(); 5 data.open("GET", path, false); 6 data.send(null); 7 8 var getCsvData = data.responseText; 9 csvData = getCsvData.split("\n"); 10 return csvData; 11} 12 13function arrayToTourismList(array){ 14 var arrayT = []; 15 var tourismListItem = {}; 16 var headerLine = ['id','name','areaID','category','smallCategory','description','postalCode','address','tell','lat','lng','time','holiday','parking','accsess','fee']; 17 18 for (var i = 1; i < array.length-1; i++) { 19 var value = array[i].split(","); 20 for(var n=0; n<value.length; n++){ 21 var key = headerLine[n]; 22 tourismListItem[key] = value[n]; 23 } 24 arrayT[i]=tourismListItem; 25 document.getElementById("test").innerHTML += arrayT[i]['name'] +"<br />"; 26 } 27 return arrayT; 28} 29 30function initialize(){ 31 var CSVdata = csvToArray("tourist.csv"); 32 var tourismList = arrayToTourismList(CSVdata); 33  ・・・(以降別処理)

###試したこと
arrayT.push(tourismListItem)を試しましたがエラーにより配列に入りませんでした。
コンソールエラー:Uncaught TypeError: Cannot read property 'push' of undefined

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

配列の中身すべてが最終要素で上書きされて入ってしまいます。

その原因は、配列に同じオブジェクト(連想配列)を何回も入れているからです。
配列の中にある全てのアイテムは1つのオブジェクトを指しているため、そのオブジェクトが書き換えられると、配列の中身すべてが上書きされたように見えているわけです。

以下のように、毎回オブジェクトを作成してそれを配列に入れるコードを試してみてください。

javascript

1function arrayToTourismList(array){ 2 var arrayT = []; 3 var headerLine = ['id','name','areaID','category','smallCategory','description','postalCode','address','tell','lat','lng','time','holiday','parking','accsess','fee']; 4 5 for (var i = 1; i < array.length-1; i++) { 6 var tourismListItem = {}; // ●ここで毎回オブジェクトを作成 7 var value = array[i].split(","); 8 for(var n=0; n<value.length; n++){ 9 var key = headerLine[n]; 10 tourismListItem[key] = value[n]; 11 } 12 arrayT[i]=tourismListItem; 13 document.getElementById("test").innerHTML += arrayT[i]['name'] +"<br />"; 14 } 15 return arrayT; 16}

投稿2017/11/13 08:54

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cookie1123

2017/11/14 02:11

迅速な回答と分かり易い解説ありがとうございました!無事配列に格納することが出来ました。 オブジェクトの取り扱いについて改めて勉強し直します。また何かあった際はよろしくお願いいたします。
guest

0

var tourismListItem = {};

↓↓↓

javascript

1var tourismListItem = [];

として

tourismListItem[key] = value[n];

javascript

1if(typeof tourismListItem[i] ==="undefined"){ 2 tourismListItem[i]={} 3} 4tourismListItem[i][key] = value[n];

のような処理ですかね

投稿2017/11/13 08:58

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cookie1123

2017/11/14 02:17

詳細なコードと迅速な回答ありがとうございました!配列への収め方に問題があったのですね。 一行ずつしっかり勉強していきます。また質問があった際はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問