2017-11-22 14 views
2

データを保持するためにGoogleシート(スプレッドシート)を使用せずに未知のサイズの多次元配列に追加することは可能ですか? 3次元配列の例を見つけることができません。ここでGoogleスクリプトの多次元配列にデータを追加/追加する方法

は、私が何をしたいです:

var aDirTree=[];  
aDirTree[0][0][0]="myName1"; 
aDirTree[0][0][1]="myURL1"; 
aDirTree[1][0][0]="myName2"; 
aDirTree[1][0][1]="myURL2"; 
//Notice we are skipping elements 
aDirTree[2][5][0]="myName3"; 
aDirTree[2][5][1]="myURL3"; 
スキップされた値がnullである

?私はプッシュメソッドのいくつかの並べ替えかもしれないと思います。あなたは任意の深さを与える

答えて

2

は、配列をキーとして使用することができます(それは文字列に変換されます):

var o = {} 
 
o[[1,2,3]]='a' 
 
o['4,5,6']='b' 
 

 
console.log(o)   // { "1,2,3": "a", "4,5,6": "b" } 
 
console.log(o[[0,0,0]]) // undefined

Proxynot available in IE) は、別の代替することができますが、それは余分な値の多くを作成します。

var handler = { get: (a, i) => i in a ? a[i] : a[i] = new Proxy([], handler) } 
 

 
var a = new Proxy([], handler) 
 

 
a[1][2][3]='a' 
 
a[4][5][6]='b' 
 

 
console.log(a)   // [[],[[],[],[[],[],[],"a"]],[],[],[[],[],[],[],[],[[],[],[],[],[],[],"b"]]] 
 
console.log(a[0][0][0]) // []

そして最後に、 "本物" の答え:

function set(a, x, y, z, v) { ((a = a[x] || (a[x] = []))[y] || (a[y] = []))[z] = v } 
 
function get(a, x, y, z, v) { return (a = a[x]) && (a = a[y]) && z in a ? a[z] : v } 
 

 
var a = [] 
 
set(a,1,2,3,'a') 
 
set(a,4,5,6,'b') 
 

 
console.log(get(a,0,0,0))   // undefined 
 
console.log(get(a,0,0,0,'default')) // "default" 
 
console.log(a)      // [,[,,[,,,"a"]],,,[,,,,,[,,,,,,"b"]]]


ボーナス:すべての3の組み合わせが、非常に効率的ではない、キーが文字列に変換されるため:素晴らしい

var a = [], p = new Proxy(a, { set: (a, k, v) => 
 
    ([x,y,z] = k.split(','), ((a = a[x] || (a[x] = []))[y] || (a[y] = []))[z] = v) }) 
 

 
p[[1,2,3]] = 'a' 
 
p[[4,5,6]] = 'b' 
 

 
console.log(a[[0,0,0]]) // undefined 
 
console.log(a)   // [,[,,[,,,"a"]],,,[,,,,,[,,,,,,"b"]]]

+0

ああ、私はRun Code Snippet機能が大好きです。そのコードを変更して、配列に入力された値を読み取ることができますか?ログ出力が表示されますが、値o [0] [0] [0]を読み込もうとするとエラーが発生します。 –

+0

ばかげた 'Proxy'解決策のためにupvoteを持っています;) – vzwick

+0

ああ私は文字列に間違ってアクセスしようとしていました。私はあなたの最初の例を得ました。私はそのように抽出したい要素を参照しなければなりませんでした。aDirTree [[0,0,0]] 2番目の例で何が起きているかを見るのにちょっと時間を要するでしょう。ありがとう。 –

1
function writeToTree(tree, first, second, third, value) 
{ 
    tree[first]    || (tree[first]    = []); 
    tree[first][second]  || (tree[first][second]  = []); 
    tree[first][second][third] || (tree[first][second][third] = []); 

    tree[first][second][third] = value; 
} 
var aDirTree = []; 
writeToTree(aDirTree, 1, 55, 3, "someValue"); 

または再帰的に、:lazier版で

function writeToTree(tree, position, value) 
{ 
    var insertAt = position.shift(); 
    tree[insertAt] || (tree[insertAt] = []); 
    if (position.length === 0) 
    { 
     tree[insertAt] = value; 
     return; 
    } 
    writeToTree(tree[insertAt], position, value); 
} 
var aDirTree = []; 
writeToTree(aDirTree, [1, 55, 3], "someValue"); 
console.log(aDirTree); 
+0

。あなたはそのための関数を作成しました。私はあなたが任意の深さで再帰的に何を意味するのか把握し、それをテストする必要があります。私はまた、短くてシンプルなあなたの上の答えに気づいたが、それはまだ動作しませんまたは私は間違ってそれを実装しています。 –

+0

@Slaiの答えは '配列'を返しませんが、 'オブジェクト'は、おそらくあなたが使用しているライブラリをトリップしています。 「任意の深さ」とは、その関数で4,5,6 ...次元配列を作成できるということです。 – vzwick

+0

私は今それを得る素晴らしいです。それは4次元の配列でそれをテストしました。引用符で囲まれた "someValue"ではなく、writeToTree(tree [insertAt]、position、value)を読み込むために再帰的配列コード行を変更しなければならなかったので、私は誤植をしています。 –

関連する問題