2012-04-20 7 views
1

配列を値に初期化すると、最初の配列よりも2番目の配列にマージする最適な方法でしょうか?単純なディメンションのために配列をベースにマージする

var a = [[0,0,0,0], [0,0,0,0]]; // 2x4 
var b = [[1,1], [2,2]]; 

を使用することができる:

var base = [0, 0, 0, 0, 0, 0, 0, 0]; 
var add = [1, 2, 3, 4]; 
for (i in add) { 
    base[i] = add[i]; 
} 

>>> base 
[1, 2, 3, 4, 0, 0, 0, 0] 

しかし、どのように約2または3次元?

答えて

1

これを試してみてください。

var mergeArr = function(arrFrom, arrTo) { 
    for(var i=0;i<arrFrom.length; i++) { 
    if (Array.isArray(arrFrom[i]) && Array.isArray(arrTo[i])) { 
     mergeArr(arrFrom[i], arrTo[i]); 
    } else { 
     arrTo[i] = arrFrom[i]; 
    } 
    } 
} 

はあなたがそれで投げる任意の次元で動作するはずです。

+0

ああ、配列の代わりに 'for..in'を使わないでください。代わりに' for..var'を使ってください:http://stackoverflow.com/question/7223697/for-var-i-0-ia-length-i-vs-for-var-i-in-a –

+0

唯一の問題は、* isArray *メソッドがECMAScript第3版標準にないことです。現在のすべてのブラウザでほぼ完全に実装されています。しかし、私はArray.isArray *を* arrFrom [i] .lengthで置き換えることができると考えています* –

+0

適切な情報を提供していれば、特定の関数が存在しない場合の答えを返します。 –

2

二次元:

for (i in add) { 
    for (j in add[i]) 
     base[i][j] = add[i][j]; 
} 

三次元:

for (i in add) { 
    for (j in add[i]) 
     for (k in add[i][j]) 
      base[i][j][k] = add[i][j][k]; 
} 

など

任意の数の次元のために、あなたは再帰的に問題を解決することができます:

function merge(source, destination){ 
    if (source[0] instanceof Array) { 
    for (i in source) merge(source[i], destination[i]) // go deeper 
    } 
    else { 
    for (i in source) destination[i] = source[i]; 
    } 
} 

をし、あなたが呼ぶ それに:merge (add, base);

+0

未定義に追加されない要素を設定する:[1,2,3,4、未定義、未定義、未定義、未定義] –

+0

入力は何ですか? (ベースと追加) – gabitzish

+0

私のコードに少し間違いがありました。私はdestination [i] = source [i]の代わりにsource [i] = destination [i]を書いています。 – gabitzish