JS多维数组修改值

时间:2015-11-17 11:14:15

标签: javascript multidimensional-array

我在一个函数中,我从父容器中获取一个多维数组。获取的数组并不总是具有相同的尺寸(可以是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长度)。

1 个答案:

答案 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倍)。