最速怪談選手権

javascriptの引数と返数がよく理解していないのでお聞きします。自分が理想とする値がコンソールされていないことで困っております。下から4行目あたりのconsole.log (tmp);で
   name: '名前',
   address: '住所',
   coordinate: [Number(csvArray1[0]), Number(csvArray2[0])],
   discription: "説明"
がコンソールされると思ったのですが、
function createdata(csvArray1, csvArray2) {
 tmp = [
  {
   name: '名前',
   address: '住所',
   coordinate: [Number(csvArray1[0]), Number(csvArray2[0])],
   discription: "説明"
  }
 ]; 
 console.log (tmp[0].coordinate);
 return [tmp];
}
まで値がでてしまいます。引数がおかしいのか、返数がおかしいのでしょうか。長文でしたが、ご指摘お願いいたします。

/** csvデータ取り出す */
function mainFunc (callback) {
 var xhr = new XMLHttpRequest();
 xhr.onload = function() {
  callback.apply (null, createArray(xhr.responseText));
 };
 xhr.open("get", "./csvfile/sample2.csv", true);
 xhr.send(null);
}
/** 配列を作成 */
function createArray(csvData) {
 var tempArray = csvData.split("\n");
 var csvArray = [], csvArray1 = [], csvArray2 = [];
 
 for(var i = 0; i<tempArray.length;i++){
  csvArray[i] = tempArray[i].split(",");
  csvArray1[i] = csvArray[i][1];
  csvArray2[i] = csvArray[i][2];
 }
 return [csvArray1, csvArray2];
}
/** 位置情報を作成 */
function createdata(csvArray1, csvArray2) {
 tmp = [
  {
   name: '名前',
   address: '住所',
   coordinate: [Number(csvArray1[0]), Number(csvArray2[0])],
   discription: "説明"
  }
 ]; 
 console.log (tmp[0].coordinate);
 return [tmp];
}

function loadMap(tmp) {
 console.log (tmp);
}

mainFunc(createdata);
loadMap(createdata);

A 回答 (1件)

こんにちは



まずは、ご質問の内容に関して。
>下から4行目あたりのconsole.log (tmp);で
  ~~
>まで値がでてしまいます。

呼び出されている関数は
>function loadMap(tmp) {
> console.log (tmp);
>}
ですが、呼び出し側は、
>loadMap(createdata);
となっており、この時の引数 createdata は既定義の関数です。
ですので、loadMapがtmpとして受け取るのは関数(そのもの)です。
従って、
>console.log (tmp);
は、
 console.log ( createdata );
と同じ意味となり、関数の内容が出力されているということです。

javascriptはオブジェクトベースの言語で、変数には単純な値だけでなく、配列やオブジェクトでも関数(=オブジェクトの一種)やDOMでも同じように代入できます。
例えば、
 function a(){ alert("hoge"); }
 var b = a;
 alert(b);
としてみれば、(試してみればわかりますが)1行目の定義の内容が表示されます。


その他の疑問点
「csvデータ取り出す」、「配列を作成」までは理解ができますが、「位置情報を作成」以降は何をどうしたいのか意図がまったくわかりません。

特に、createdata関数は配列から、オブジェクトの配列を作成するのではないかと想像しますが、返すのは常に同じ値を利用したオジェクトを一つだけ持つ配列をさらに配列化したものに固定されています。
利用しているデータは、csvArray1[0]とcsvArray2[0]だけなので、同じものしか返しません。

というよりも、一旦、配列化してからオブジェクト化するのなら、直接オブジェクト化すれば良さそうなものだと思います。
最終的に、何を得たいのかが不明なので、何ともわかりませんけれど。

前回の質問でも指摘しましたが)tmpは配列であり、return値が [tmp] となっているので、例えば
 var obj = createdata(csvArray1, csvArray2);
とした場合に、オブジェクトの"名前"を得るのには、
 obj[0][0].name
としなければなりません。
しかも、この配列の添え字は0以外は使えないことになります。(それ以外は未定義)

そもそも論になりますが、元のcsvデータでは、名前、入所、位置などがセットになっているのではないのでしょうか?
それを読み込むのなら、素直にそのまま全体をオブジェクトの属性としてセットするのが普通ではないかと思いますけれど・・・(不要な属性はカットしますが)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!