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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

Intra-mart

Intra-martは、 NTTデータの独自フレームワークです。 JavaEEのSeasar2(SAStruts+S2JDBC)ベースであり、 オンプレミスではシステム基盤、クラウド上ではPaaSとして利用出来ます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1594閲覧

Javascriptにおけるオブジェクトの初期化がうまくいきません

hatsuzo

総合スコア56

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

Intra-mart

Intra-martは、 NTTデータの独自フレームワークです。 JavaEEのSeasar2(SAStruts+S2JDBC)ベースであり、 オンプレミスではシステム基盤、クラウド上ではPaaSとして利用出来ます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/13 09:15

前提・実現したいこと

c3.jsを使ってデータベースから取得した値を使ってグラフを作成しようと思っています。
データベースの値は、サーバーサイドのJavascriptで作成し、その戻り値をc3.jsのオブジェクトに渡して表示することを考えています。

発生している問題・エラーメッセージ

サーバーサイドの値の取得自体はできており、個別の変数として呼び出し元に返すことは可能なのですが、値が可変のため、c3.jsに渡す時のオブジェクトの形(配列要素を含む)で渡そうと思っています。そこで、同じオブジェクトをクライアント側で参照できた方法で、値をセットしているのですが、うまくいきません。

Cannot read property "columns" from undefined```

該当のソースコード

サーバーサイドスクリプトはintramartというフレームワークを使用しています。
ボタンをクリックした時にデータベースの値を参照してグラフ表示します。

html

1 <imart type="jsspRpc" name="asinfo" page="jssp_rpc_test/sample1" /> 2 <script language="JavaScript"> 3 // c3.jsで使用するオブジェクトの形式(データベースで参照する内容と値は異なるが構造は同じ) 4 const chart00 = ({ 5 data: { 6 columns: [ 7 ['data1', 430, 200, 100, 400, 150, 250], 8 ['data2', 130, 100, 140, 200, 150, 50] 9 ], 10 type: 'bar' 11 }, 12 bar: { 13 width: { 14 ratio: 0.5 15 } 16 }, 17 axis: { 18 x: { 19 type: 'category', 20 categories: ['1月', '2月', '3月', '4月', '5月', '6月'] 21 } 22 } 23 }); 24 function execute(){ 25 try{ 26 var chart = new Object(); 27 var result = asinfo.getHarmony(args); // chart00と同じ型のオブジェクトを返す 28 chart = c3.generate(result); 29 // chart = c3.generate(chart00); 上記2行をこれに置き換えると正常表示 30 } 31 catch(ex){ 32 alert(ex.message); 33 return; 34 } 35 } 36 </script> 37 </imart> 38 <input type="button" value="実行(同期)" onclick="execute();"> 39 <div id="chart" style="border:1px solid gray; text-align:right; width:700px;"></div>

javascript

1function getHarmony( args ){ 2 var db = new SharedDatabase('as400'); 3 var sql = "select su2nend, " + 4 "sum(su2ur01) as ur1, sum(su2ur02) as ur2, sum(su2ur03) as ur3, " + 5 "sum(su2ur04) as ur4, sum(su2ur05) as ur5, sum(su2ur06) as ur6, " + 6 "sum(su2ur07) as ur7, sum(su2ur08) as ur8, sum(su2ur09) as ur9, " + 7 "sum(su2ur10) as ur10, sum(su2ur11) as ur11, sum(su2ur12) as ur12, " + 8 "sum(su2ar01) as ar1, sum(su2ar02) as ar2, sum(su2ar03) as ar3, " + 9 "sum(su2ar04) as ar4, sum(su2ar05) as ar5, sum(su2ar06) as ar6, " + 10 "sum(su2ar07) as ar7, sum(su2ar08) as ar8, sum(su2ar09) as ar9, " + 11 "sum(su2ar10) as ar10, sum(su2ar11) as ar11 ,sum(su2ar12) as ar12 " + 12 "from mylib.uritrn " + 13 "where su2nend >= 2017 " + 14 "group by su2nend " + 15 "order by su2nend"; 16 var ret = db.select(sql); 17 var graph = new Object(); 18 for (var i = 0; i < ret.countRow; i++) { 19 graph['data']['columns'][i][0] = ret.data[i].su2nend; // ここでエラー発生と思われます 20 graph['data']['columns'][i][1] = ret.data[i].ur1; 21 graph['data']['columns'][i][2] = ret.data[i].ur2; 22 graph['data']['columns'][i][3] = ret.data[i].ur3; 23 graph['data']['columns'][i][4] = ret.data[i].ur4; 24 graph['data']['columns'][i][5] = ret.data[i].ur5; 25 graph['data']['columns'][i][6] = ret.data[i].ur6; 26 graph['data']['columns'][i][7] = ret.data[i].ur7; 27 graph['data']['columns'][i][8] = ret.data[i].ur8; 28 graph['data']['columns'][i][9] = ret.data[i].ur9; 29 graph['data']['columns'][i][10] = ret.data[i].ur10; 30 graph['data']['columns'][i][11] = ret.data[i].ur11; 31 graph['data']['columns'][i][12] = ret.data[i].ur12; 32 } 33 graph['data']['type'] = 'bar'; 34 graph['bar']['width']['ratio'] = 0.5; 35 graph['axis']['x']['type'] = 'category'; 36 graph['axis']['x']['categories'][0] = "1月"; 37 graph['axis']['x']['categories'][1] = "2月"; 38 graph['axis']['x']['categories'][2] = "3月"; 39 graph['axis']['x']['categories'][3] = "4月"; 40 graph['axis']['x']['categories'][4] = "5月"; 41 graph['axis']['x']['categories'][5] = "6月"; 42 graph['axis']['x']['categories'][6] = "7月"; 43 graph['axis']['x']['categories'][7] = "8月"; 44 graph['axis']['x']['categories'][8] = "9月"; 45 graph['axis']['x']['categories'][9] = "10月"; 46 graph['axis']['x']['categories'][10] = "11月"; 47 graph['axis']['x']['categories'][11] = "12月"; 48 return graph;

試したこと

javascript

1// var result = asinfo.getHarmony(args); // chart00と同じ型のオブジェクトを返す 2// chart = c3.generate(result); 3 chart = c3.generate(chart00); 上記2行をこれに置き換えると正常表示

constで定義した中身を表示したところ、当然正常なので、サーバーサイド側だけの問題であることは間違いないのですが、
この時、クライアント側で、const chart00 として定義してあるオブジェクトを直接参照すると、値が参照できますが、その値をコピーしたオブジェクトを参照するとエラーになります。

javascript

1 alert(chart00['data']['type']); // とした時は、正常 2 alert(chart['data']['type']); // とした時は、エラー

下記については、クライアントサイドからのエラーメッセージになりますが、

Cannot read property "type" from undefined```

というエラーが、サーバーサイド側で値をセットするのと同じく出ますので、最初はイントラマート固有の問題かと思ったのですが、おそらくオブジェクトの扱い方、初期化の問題ではないかと思います。いろいろネット上で検索しても私の理解の範疇を越えており、よく判りません。

オブジェクトの初期化の方法についてアドバイス頂けたら有難いです。
よろしくお願いします。

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

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

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

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

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

kuma_kuma_

2020/10/13 15:44 編集

質問者様 > chart = c3.generate(result); ここで一度止めて開発コンソールでresultの中身を確認されては? あと気になるのが > var graph = new Object(); は事前に > var graph = {}; > graph['data'] = {}; > graph['data']['columns'] = []; とか事前準備の設定しないと...
hatsuzo

2020/10/14 02:04

kuma_kuma_様 コメントありがとうございます。 初期化が必要なのですね。 ご指摘のように、オブジェクトの部分は > graph['data'] = {}; 配列の部分は > graph['data']['columns'] = []; というように全て初期化してみました。 オブジェクトの部分はうまく取り出すことが出来ていますので、問題ないのですが、相変わらず、配列の部分がうまくセットできません。 二次元配列を一次元と見なして、 for(var i = 0 ; i < ret.countRow ; i++){ graph['data']['columns'].push(ret.data[i].uri01); graph['data']['columns'].push(ret.data[i].uri02); } という具合に初期化したところ、 他の一次元配列の部分は問題なく初期化できたのですが、 二次元配列の部分が、 alert(graph['data']['columns'][0][5]) のように参照したところ、エラーになりますので、 配列の要素数分を予め0クリアしてから、値をセットしようとしたところ、 0をセットするところで、 Cannot set property "0.0" of undefined to "0" のエラーが出てしまいました。 for(var i = 0 ; i < ret.countRow ; i++){ var wrk = []; wrk.push(ret.data[i].uri01); wrk.push(ret.data[i].uri02); graph['data']['columns'].push(wrk); } のように、一旦一次元にpushしてからpushし直したところ、うまく動作しました。 手を抜いてはダメですね。 どうも有難うございました。
guest

回答1

0

ベストアンサー

オブジェクトの初期化の方法について

プロパティを深く掘り下げたオブジェクトを作るのであれば、
オブジェクトリテラルで初期化するのがスマートです。`

javascript

1var graph = { 2 data:{ 3 columns:[], // ココは forループで追加する。 4 type:"bar", 5 } 6 bar :{ 7 width: { 8 ratio: 0.5 9 } 10 }, 11 axis: { 12 x: { 13 type: "category", 14 categories: [ 15 "1月", "2月", "3月", "4月", "5月", "6月", 16 "7月", "8月", "9月", "10月", "11月", "12月" 17 ] 18 } 19 } 20}; 21 22for (var i = 0; i < ret.countRow; i++) { 23 var oj = ret.data[i]; 24 graph.data.columns[i] = [ 25 oj.su2nend, 26 oj.ur1, oj.ur2, oj.ur3, oj.ur4, oj.ur5, oj.ur6, 27 oj.ur7, oj.ur8, oj.ur9, oj.ur10, oj.ur11, oj.ur12 28 ]; 29} 30console.log( graph );

投稿2020/10/15 05:07

AkitoshiManabe

総合スコア5432

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

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

hatsuzo

2020/11/10 03:48

AkitoshiManabeさん コメントありがとうございました。 シンプルにできるのですね。.... まだまだ修行が足りないこと痛感しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問