我在一个函数中,我从父容器中获取一个多维数组。获取的数组并不总是具有相同的尺寸(可以是1D,2D,3D,4D,......)。
我有参数一个包含坐标和值的一维数组。
function(coordinates_array, value) {
var muti_dim_array = getArrayByName(another_param);
}
不幸的是,我无法做到
multi_dim_array[coordinates_array[0]][coordinates_array[1]][...]
因为尺寸并不总是相同的。
我可以用coordinate_array的长度来做一个switch case,但是因为我的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;
也不起作用。
如果在一维数组中修改坐标,以及新值,如何以通用方式更新多维数组(具有不同的维度)?
示例:
我可以作为参数
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 :(得分: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个不同的数组(顶部,左侧,宽度,高度), ...)。
经过几次性能测试后,我决定选择一个“丑陋”的开关案例:
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()快一倍(完成交换机案例需要10ms,完成评估测试需要5000ms以上)。
如果有人找到比交换机案例更清洁的解决方案,我仍然感兴趣,即使它的性能稍差(不超过2倍;但是3倍)。