2016-06-27 8 views
0

Googleシートで3D配列を定義しようとしましたが、.slice()メソッドを使用していても配列を参照渡ししています。JavaScriptで3D配列を定義する

var temp = []; 
for (var a = 0; a<archetypesAll.length; a++) {temp[a] = [0, a].slice();}; 
var archRank = []; 
for (var a = 0; a<21; a++) {archRank[a]= temp.slice();}; 
archRank[2][1][0] = 'Test'; 

Iは行列の単一の要素を編集する代わりに、上記のコードは、単に正確に同じ値(「テスト」)を用いてすべての行を埋め:

3DMatrix[x][1][0] = 'Test' 
+0

そして、何あなたの期待がある:あなたはこのように、あなた自身のdeepCopy methidを書くことがありますか?どのように配列を渡したいですか? そして、書式に注意してください。 – Elyasin

+0

私の期待は、行archRank [2] [1] [0] = 'テスト'です。すべての行の代わりに要素[2] [1] [0]を 'Test'で塗りつぶすだけです – user3637122

+0

なぜあなたはあなたの文の中の言葉の配列/参照を言いますか?それは私が考えるとかなり混乱しています。 – Elyasin

答えて

0

次の場所でsliceを呼び出すことで、多次元配列をコピーすることはできませんそれは全体を深くコピーしないからです。

function allocate(mainDim, ...dims) { 
 
    const result = new Array(mainDim); 
 
    for (let i = 0; i < result.length; i++) { 
 
    result[i] = dims.length > 0 ? allocate(...dims) : 0; 
 
    } 
 
    return result; 
 
} 
 

 
function deepCopy(matrix, dims) { 
 
    return dims > 1 ? matrix.map(row => deepCopy(row, dims - 1)) : matrix.slice(); 
 
} 
 

 
function test() { 
 
    const mx1 = allocate(3,2,2); 
 
    mx1[2][1][0] = "Test"; 
 
    console.log(JSON.stringify(mx1)); 
 
    const mx2 = deepCopy(mx1, 3); 
 
    mx2[2][1][0] = "Copied"; 
 
    console.log(JSON.stringify(mx1)); 
 
    console.log(JSON.stringify(mx2)); 
 
} 
 
test();

+0

実際にはJSON.parse(JSON.stringify([0、a]));を使用して問題になっている可能性があります。 – Arg0n

+0

@ Arg0nそれはコピーしてはならない葉ノードとしてのオブジェクトを持っていない限り、短く素敵で高速な解決策です。 –

0
var array = ["Test", "Test"];  
var array3d = [[array.slice(0)],[[array.slice(0)]]]; 
array3d[0][0][0] = "Changed"; 
console.log(JSON.stringify(array3d)); //[[["Changed","Test"]],[[["Test","Test"]]]] 

これで試しスライスの代わりに参照の代わりに新しい配列を取得することができます。

var temp = []; 
for (var a = 0; a < archetypesAll.length; a++) { 
    temp[a] = JSON.parse(JSON.stringify([0, a])); 
} 
var archRank = []; 
for (var a = 0; a < 21; a++) { 
    archRank[a]= temp.slice(); 
} 
archRank[2][1][0] = 'Test'; 
関連する問題