一次元配列xを受け取り、合計値y(スカラー)を戻します。
一次元配列 a=[10, 11, 12, 13] の部分配列[11, 12] だけを関数に渡そうとして、関数( a.slice(1, 2) ) としたのですが、うまくいきません。
関数(a, 1, 2) のように 関数(配列, 先頭, 末尾) の形式にするしかなさそうです。
function 関数12(x) { : 関数11と同じ } |
function 呼出12() { var a = [10, 11, 12, 13]; var b = 関数12( a.slice(1, 2) ); // 11と12のつもり : // 表示処理 } |
一次元配列xを受け取り、各要素に100を加えた一次元配列yを戻します。呼出側は var b = 関数(a); とすれば、あえてb= [];と宣言しなくても一次元配列になります。このことは、二次元は列でも同じです。
正しく更新できる例を示します。
先の例で、関数の内部で更新処理が完了したので、return x; は不要かと思うkもしれませんが、そうではないのです。return x; を外す、あるいは単に return; としたのでは、戻り値が undefind になります。それで a = 関数(a); によりaが破壊されてしまい、以下のaに関する処理が出現した時点でエラーになってしまうのです。
function 呼出15() { var a = [10, 11, 12, 13]; : // 呼出前の表示処理 a = 関数15(a); : // 呼出後の表示処理 } |
関数側で二次元配列xを定義して、return x: とし、呼出側で var a = 関数(); とすれば、aはxと同じサイズの二次元配列になります。
aの行数は、行数 = a.length; で得られます。行0に最大個数の要素があるならば、列数は 列数 = a[0].length; で得られます。
var x = [ [ 0, 1, 2, ], // 最後の要素 [0][3] が欠落 [ 0, 1, 2] でも同じ。列数=3にな [10, , 12,13], // 途中の要素 [1][1] が空白。列数=4 [20,21,22,23] ];
上のように欠落要素があったとします。
受取側で、列数 = a[0].length; とすると列数が3になってしまいます。それで各行での列数を調べてその最大値を列数にする必要があります。
欠落要素はundefinedになります。そのままだと後の処理で困ることがありますので、そのうな場合には、全要素について
if ( (要素 == null) || (要素 === undefined) ) 要素 = "";
のような変更をしておきます。
function 呼出22() { var a = 関数22(); // ここで配列aを宣言 var 行数 = a.length; var 列数 = 0; // ====== 列数の計算 行0は3、行1は4、行2は4 for (var i = 0; i < 行数; i++) { if (a[i].length > 列数) 列数 = a[i].length; } : // 表示処理 21と同じ } |
一次元配列でも示したように、呼出側で定義した配列を関数で加工して全く異なる配列にして戻すことができます( return y; が必要)。
その例として、二次元配列aを行と列を交換した転置行列にします。
特に配列の加工をする関数では、複数の戻り値が必要となることが多くあります。
関数側: return [ 変数0, 変数1, … , 変数N ]; // [ ] で囲む
呼出側:
var 戻り値 = 関数();
var 変数0 = 戻り値[0]; // 0,1 は return での記述順序、必要なものだけを列挙づればよい。
var 変数1 = 戻り値[1];
:
var 変数N = 戻り値[n];
戻す個数が多くなると順序よりも名称のほうが便利です。
関数側: return { 名前0:変数0, 名前1:変数1, … , 名前N:変数N }; // { } で囲む
呼出側:
var 戻り値 = 関数();
var 変数0 = 戻り値.名前0: // 必要なものだけを列挙すればよい
var 変数1 = 戻り値.名前1:
:
var 変数N = 戻り値.名前N:
function 関数32() { : // 31と同じ return { "col":列名, "array":配列, "collength":行数, "rowlength": 列数 }; // { } で囲む } |
function 呼出32() { var 戻り値 = 関数32(); var 列名 = 戻り値.col; var 配列 = 戻り値.array; var 行数 = 戻り値.collength; var 列数 = 戻り値.rowlength; : // 行数・列数は上で得られるので、それらを求める処理は不要 : // 他は31と同じ } |