1

JavaScript中有選擇多維數組元素的方法嗎?深度/等級/維度是可變的,並且密鑰由一系列索引給出。這樣我就沒有分開處理每個可能的維度深度。具體來講,我想辦擺脫開關情況下,像在這裏:JavaScript中的索引數組的多維索引

/** 
* set tensor value by index 
* @type {array} indices [ index1, index2, index3 ] -> length == rank. 
* @type {string} value. 
*/ 
tensor.prototype.setValueByIndex = function(indices, value) { 
    var rank = indices.length; 

    switch(rank) { 
     case 0: 
      this.values[0] = value; 
     break; 
     case 1: 
      this.values[indices[0]] = value; 
     break; 
     case 2: 
      this.values[indices[0]][indices[1]] = value; 
     break; 
     case 3: 
      this.values[indices[0]][indices[1]][indices[2]] = value; 
     break; 
    } 
} 

this.values是一個多維數組。

這樣,我得到的東西看起來更像是這樣的:

/** 
* set tensor value by index 
* @type {array} indices, [ index1, index2, index3 ] -> length == rank 
* @type {string} value 
*/ 
tensor.prototype.setValueByIndex = function(indices, value) { 
    var rank = indices.length; 

    this.values[ indices ] = value; 
} 

預先感謝您!

+0

可能重複[array.contains(obj)in JavaScript](http://stackoverflow.com/questions/237104/array-containsobj-in-javascript) –

回答

2
tensor.prototype.setValueByIndex = function(indices, value) { 
    var array = this.values; 
    for (var i = 0; i < indices.length - 1; ++i) { 
     array = array[indices[i]]; 
    } 
    array[indices[i]] = value; 
} 

這使用array指向嵌套數組我們目前並通過indicies爲找到當前array下一個array值讀取。一旦我們到達indices列表中的最後一個索引,我們就找到了想要存儲值的數組。最終的索引是最後一個數組中存儲該值的槽。

+0

它像一個魅力:)。非常感謝你!! –

1

是否這樣?

tensor.prototype.setValueByIndex = function(indices, value) { 
    var t = this, i; 
    for (i = 0; i < indices.length - 1; i++) t = t[indices[i]]; 
    t[indices[i]] = value; 
} 
+0

不,他想要一個* set *而不是* get * – Bergi

+0

@Bergi : 對。修復。 – Guffa

1

事情是這樣的:

tensor.prototype.setValueByIndex = function(indexes, value) { 
    var ref = this.values; 
    if (!indexes.length) indexes = [0]; 
    for (var i = 0; i<indexes.length;i++) { 
     if (typeof ref[i] === 'undefined') ref[i] = []; 
     if (ref[i] instanceof Array) { 
      ref = ref[i]; 
     } else { 
      throw Error('There is already value stored') 
     } 
    } 
    ref = value; 
} 
1

你爲什麼要這麼做?我說寫

tensor.values[1][5][8][2] = value; 

tensor.setValues([1, 5, 8, 2], value); 

更加明晰。如果你真的需要做到這一點,這將是在陣列上的簡單循環:

tensor.prototype.setValueByIndex = function(indices, value) { 
    var arr = this.values; 
    for (var i=0; i<indices.length-1 && arr; i++) 
     arr = arr[indices[i]]; 
    if (arr) 
     arr[indices[i]] = value; 
    else 
     throw new Error("Tensor.setValueByIndex: Some index pointed to a nonexisting array"); 
}; 
+0

是的,它看起來微不足道,但。我想用一個變量「多個指數」來創建一個抽象張量,使得等級等於「指數數量」。這樣所有的操作都可以用抽象的方式來定義,而不是分別定義不同級別和維度的所有操作。 –

+0

感謝您的解決方案。事實證明,這很簡單:P,謝謝! –