JS多维数组修改值

JS multidimensional array modify value

本文关键字:修改 数组 JS      更新时间:2023-09-26

我在一个函数中,从父容器获取多维数组。提取的数组并不总是具有相同的维度(可以是1D、2D、3D、4D…)

我有一个包含坐标和值的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长度的开关情况)。

我找到了一个解决方案:

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.....
    }
}

事实上,对于一个超过100000次迭代的简单调用测试,切换用例解决方案比eval()解决方案快500倍以上(完成切换用例需要10毫秒,而完成eval测试需要5000毫秒)。

如果有人找到了比开关盒更干净的解决方案,我仍然感兴趣,即使它的性能有点差(不过不超过2倍;3倍)。