2015-11-17 88 views
0

我在一個函數,其中我從父容器中獲取multidimentional數組。獲取的數組並不總是具有相同的尺寸(可以是1D,2D,3D,4D,...)。JS multidimentional數組修改值

我有參數1D數組包含座標和值。

function(coordinates_array, value) { 
    var muti_dim_array = getArrayByName(another_param); 
} 

不幸的是,我不能這樣做

multi_dim_array[coordinates_array[0]][coordinates_array[1]][...] 

因爲尺寸不總是相同的。

我可以做一個長度爲coordinates_array的開關盒,但這會很糟糕,因爲我的multi_dim_arrays可能在1D和10D之間。

我的嘗試:

function(coordinates_array, value) { 
    var multi_dim_array = getArrayByName(another_param); 
    //Transform "[1, 2, 3]" in "[1][2][3]" 
    var coord = JSON.stringify(coordinates_array).replace(/,/g, ']['); 
    var array_value = eval('multi_dim_array'+coord); 

    array_value = value; 
} 

但它不工作,因爲

multi_dim_array[1][2][3] 

沒有更新。

這:

eval('multi_dim_array'+coord) = value; 

也不起作用。

如何以通用的方式更新多維數組(具有不同的維度),給定要在1d數組中修改的座標以及新值?

例子:

我可以有參數

coordinates_array = [1, 5, 6, 7] 
coordinates_array = [2, 3] 
coordinates_array = [8] 

,我想這樣做

multi_dim_array[1][5][6][7] = value 
multi_dim_array[2][3] = value 
multi_dim_array[8] = value 

所有在的代碼儘可能少線(沒有開關的情況下檢查coordinates_array長度)。

+0

顯示數組的情況下,請 – cpugourou

+0

我可以例如coordinate_array = [1,2,3,4,5,6]或[1,2,3] 我想multi_dim_array [1] [2] [ 3] [4] [5] [6] =值或multi_dim_array [1] [2] [3] =值 –

回答

0

我已經找到了解決辦法:

function(coordinates_array, value) { 
    var multi_dim_array = getArrayByName(another_param); 
    //Transform [1, 2, 3] in "[1][2][3]" 
    var coord = JSON.stringify(coordinates_array).replace(/,/g, ']['); 

    eval('multi_dim_array' + coord + ' = ' + value); 
} 

但我不是很滿意。 任何人都可以找到更好的解決方案嗎?

或者任何人都可以告訴我,如果我的方法是明智的表現。我經常調用這個方法:總共有700多個多維數組,它們都可以經常增加(比如當我調整一個div的大小時,我需要更新4個不同的數組(頂部,左側,寬度,高度), ...)。


經過多次PERF測試,我決定去一個「醜」開關情況:

function(coordinates_array, value) { 
    var multi_dim_array = getArrayByName(another_param); 

    switch(coordinates_array.length) { 
     case 1: multi_dim_array[coordinates_array[0]] = value;break; 
     case 2: multi_dim_array[coordinates_array[0]][coordinates_array[1]] = value;break; 
     case 3: multi_dim_array[coordinates_array[0]][coordinates_array[1]][coordinates_array[2]] = value;break; 
     case..... 
    } 
} 

事實上,一個簡單的通話測試超過10萬次迭代,發現是開關的情況下的解決方案比eval()快500倍以上(10ms完成開關情況,超過5000ms即可完成eval測試)。

如果有人發現比交換機案例更清潔的解決方案,我仍然感興趣,即使它性能稍差(不超過〜2x;但是3倍)。