2015-11-17 64 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倍)。