2017-04-11 3 views
2

は単に私が何をする必要があるかです:私は、インデックスが指定されるまで、配列のサイズをインスタンス化し、より大きなインデックスが必要な場合にサイズを大きくしたくない私の場合は3/4/multi dimentional arrayをjavascriptで作成するには?

var a = [[[]]]; 
a[1][2][3] = "hello!"; // [...[undefined,undefined,undefined,"hello!"]...]; 
a[1][2][1] = "a"; // [...[undefined,"a",undefined,"hello!"]...] 
a[2][3][4] = "new_index" // [...[undefined,"a",undefined,"hello!"]...[undefinedx4, "new_index"]] 

。 jsはマルチディメンションアレイを弱くサポートしているので、javascriptで行うのが最も簡単で清潔な方法は何ですか?

答えて

1

JS配列は参照型なので、ND配列の作成は難しいです。 cloninigツールはとても便利です。したがって、次のようにすることができます。

Array.prototype.clone = function(){ 
 
    return this.map(e => Array.isArray(e) ? e.clone() : e); 
 
}; 
 
function arrayND(...n){ 
 
    return n.reduceRight((p,c) => c = (new Array(c)).fill().map(e => Array.isArray(p) ? p.clone() : p)); 
 
} 
 

 
var arr = arrayND (2,3,4,"x") 
 
console.log(JSON.stringify(arr));

初期の引数は、次元を定義し、非常に最後の引数は、充填値です。

これはプレES6互換ブラウザでうまくいくはずです。ここで

Array.prototype.clone = function(){ 
 
    return this.map(function(e){ 
 
        return Array.isArray(e) ? e.clone() : e; 
 
        }); 
 
}; 
 

 
function arrayND(){ 
 
    var n = Array.prototype.slice.call(arguments); 
 
    return n.reduceRight(function(p,c){ 
 
         return c = Array(c).fill().map(function(e){ 
 
                  return Array.isArray(p) ? p.clone() : p; 
 
                 }); 
 
         }); 
 
} 
 

 
var arr = arrayND (2,3,4,"x"); 
 
console.log(JSON.stringify(arr));

+1

@Dragon夜、私は非常に明確でなかったかもしれない... It'aすべての初期化について。重要な点は、いったんND配列を作成すると、 'myArr [x] [y] ...を実行することで特定のインデックスに任意の値を割り当てることができるということです] = "whatever" ' – Redu

+0

問題は、arrayND(3,4,5、" x ")と書いたときに言いましたが、別のインデックスに対しても使用できません。以前の配列をオーバーライドします。インデックスを増やしたりサイズを大きくしたりすると、うまく動作しません。毎回優先されます。 – DragonKnight

+1

@Dragon Night 'arr = arrayND(2,3,4、" x ")'で配列を作成すると、3つの配列でそれぞれが満たされた2つの配列で満たされた配列のような3D配列が作成されます。 "x"はこの場合)。 'arr [1] [2] [3] =" test "'のようにすると、主配列の2番目の配列の3番目の配列の4番目の項目に '' test "'が割り当てられます。してみてください。 – Redu

1

私のソリューションです:

function assign(input) { 
 
    if ('object' !== typeof input) { 
 
     let tmp = {}; 
 

 
     tmp[input] = arguments[1]; 
 
     input = tmp; 
 
    } 
 

 
    let regex = /\.?([^.\[\]]+)|\[(\d+)]/g; 
 
    let result = {}; 
 

 
    for (let p in input) { 
 
     let data = result, prop = '', match; 
 

 
     while (match = regex.exec(p)) { 
 
      data = data[prop] || (data[prop] = (match[2] ? [] : {})); 
 
      prop = match[2] || match[1]; 
 
     } 
 

 
     data[prop] = input[p]; 
 
    } 
 

 
    return result['']; 
 
} 
 

 
// Example usage 
 
let a = assign('3[4][5]', 'hello'); 
 
let b = assign('3[4][5][6]', 'world!'); 
 
let c = assign('you.can.use.object.as.well', 'cool!'); 
 
let d = assign('or.mix[3].them[2]', 'together!'); 
 
let e = assign({'with.multiple': 'properties', 'in.a.single': 'object'}); 
 

 
let f = assign({ 
 
    '[1][2][3]': "hello!", 
 
    '[1][2][1]': "a", 
 
    '[2][3][4]': "new_index" 
 
}); 
 

 
console.log(a[3][4][5], '->', JSON.stringify(a)); 
 
console.log(b[3][4][5][6], '->', JSON.stringify(b)); 
 
console.log(c.you.can.use.object.as.well, '->', JSON.stringify(c)); 
 
console.log(d.or.mix[3].them[2], '->', JSON.stringify(d)); 
 
console.log(e.with.multiple, '->', e.in.a.single, '->', JSON.stringify(e)); 
 

 
console.log('f[1][2][3]:', f[1][2][3]); 
 
console.log('f[1][2][1]:', f[1][2][1]); 
 
console.log('f[2][3][4]:', f[2][3][4]);

+0

あなたの答えをありがとう。私は質問と事例を改善しようとしました。どうぞご覧ください。 – DragonKnight

+0

@DragonKnightユースケースでassign関数を使用する方法を示す例を更新しました。 –

関連する問題