スタートページJavascript関数への引数渡し

関数への配列引数と配列戻り値


一次元配列

例11:一次元配列を関数に渡す

一次元配列xを受け取り、合計値y(スカラー)を戻します。

例12:部分配列はうまくいかない

一次元配列 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のつもり
    : // 表示処理
}

例13:関数から一次元配列を戻す

一次元配列xを受け取り、各要素に100を加えた一次元配列yを戻します。呼出側は var b = 関数(a); とすれば、あえてb= [];と宣言しなくても一次元配列になります。このことは、二次元は列でも同じです。

例14:呼出側の配列の値を関数で更新する

正しく更新できる例を示します。

例15:return x; が必要

先の例で、関数の内部で更新処理が完了したので、return x; は不要かと思うkもしれませんが、そうではないのです。return x; を外す、あるいは単に return; としたのでは、戻り値が undefind になります。それで a = 関数(a); によりaが破壊されてしまい、以下のaに関する処理が出現した時点でエラーになってしまうのです。

function 呼出15() {
  var a = [10, 11, 12, 13];
     : // 呼出前の表示処理
  a = 関数15(a);
     : // 呼出後の表示処理
}

二次元配列

例21:関数側で定義した二次元配列を戻す

関数側で二次元配列xを定義して、return x: とし、呼出側で var a = 関数(); とすれば、aはxと同じサイズの二次元配列になります。
aの行数は、行数 = a.length; で得られます。行0に最大個数の要素があるならば、列数は 列数 = a[0].length; で得られます。

例22:欠落がある場合

  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と同じ
} 

例23:呼出側で定義した二次元配列を関数で変更する

一次元配列でも示したように、呼出側で定義した配列を関数で加工して全く異なる配列にして戻すことができます( return y; が必要)。
その例として、二次元配列aを行と列を交換した転置行列にします。

戻り値が複数の場合

特に配列の加工をする関数では、複数の戻り値が必要となることが多くあります。

例31:順序型

関数側: return [ 変数0, 変数1, … , 変数N ];  // [ ] で囲む
呼出側:
    var 戻り値 = 関数();
    var 変数0 = 戻り値[0];  // 0,1 は return での記述順序、必要なものだけを列挙づればよい。
    var 変数1 = 戻り値[1];
       :
    var 変数N = 戻り値[n];

例32:名前型

戻す個数が多くなると順序よりも名称のほうが便利です。

関数側: 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と同じ
}