タイトルが二次元から多次元に進化していますが前の問題を解決したやつです

まずはコード
function arrayinit(){
var args = arguments;
var idx = 0;
return ff()();
function ff(){
var a = args[idx++];
var b = args.length==idx+1?aa(args[idx]):ff();
return function(){
return new Array(a).join(" ").split(" ").map(b);
}
}
function aa(a){
return function(){return a};
}
}
使い方は、引数に各次元の要素数を書いていきます
最後の引数が初期化する値です

2,3,4と書くと2*3の配列が4で初期化されます

     arrayinit(2,3,4)
[
Array[3]
  1. 04
  2. 14
  3. 24
  4. length3
  5. __proto__Array[0]
,
Array[3]
  1. 04
  2. 14
  3. 24
  4. length3
  5. __proto__Array[0]
]

arrayinit(2,2,2,2,2,2,2,2,2)
[
Array[2]
  1. 0Array[2]
    1. 0Array[2]
      1. 0Array[2]
        1. 0Array[2]
          1. 0Array[2]
            1. 0Array[2]
              1. 02
              2. 12
              3. length2
              4. __proto__Array[0]
            2. 1Array[2]
            3. length2
            4. __proto__Array[0]
          2. 1Array[2]
          3. length2
          4. __proto__Array[0]
        2. 1Array[2]
        3. length2
        4. __proto__Array[0]
      2. 1Array[2]
      3. length2
      4. __proto__Array[0]
    2. 1Array[2]
    3. length2
    4. __proto__Array[0]
  2. 1Array[2]
  3. length2
  4. __proto__Array[0]
,
Array[2]
]


前回のと違って値を書き換えても他のに影響しません


a = arrayinit(2,2,0)
[
Array[2]
  1. 00
  2. 10
  3. length2
  4. __proto__Array[0]
,
Array[2]
  1. 00
  2. 10
  3. length2
  4. __proto__Array[0]
]
a[1][1] = 100
100
a
[
Array[2]
  1. 00
  2. 10
  3. length2
  4. __proto__Array[0]
,
Array[2]
  1. 00
  2. 1100
  3. length2
  4. __proto__Array[0]
]

といっても、最後の引数が[1,2]みたいな配列だと、全部が同じ[1,2]を指してることになるのでどれかを変えると全部変わります

これは特に問題無いと思うのでこのままにしてます
できるようにするなら、最後の引数を関数にしたときに関数の返り値を初期として設定するようにしておいて、引数に渡す関数内で、オブジェクトを1から作るか、ディープコピーするようにすればできそうです

関数実行するようにしておけば初期を固定じゃなくせるのでもっと便利になるかも