简体   繁体   English

JS多维数组修改值

[英]JS multidimensional array modify value

I am in a function where i fetch a multidimensional array from the parent container. 我在从父容器中获取多维数组的函数中。 The array fetched doesn't always have the same dimensions (it can be 1D, 2D, 3D, 4D, ...). 提取的数组并不总是具有相同的尺寸(可以是1D,2D,3D,4D等)。

I have for parameter a 1D array containing the coordinates, and the value. 我有一个参数一维数组,其中包含坐标和值。

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

Unfortunately, i can't do 不幸的是,我做不到

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

because the dimensions are not always the same. 因为尺寸并不总是相同。

I could do a switch case with the length of the coordinates_array, but that would be very bad since my multi_dim_arrays can be between 1D and 10D. 我可以使用coordinates_array的长度进行切换,但是这很不好,因为我的multi_dim_arrays可以在1D到10D之间。

What i tried : 我试过的

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

But it doesn't work since 但是自那以来它不起作用

multi_dim_array[1][2][3]

isn't updated. 没有更新。

And this : 和这个 :

eval('multi_dim_array'+coord) = value;

doesn't work either. 也不起作用。

How to update in a generic way a multidimentional array (with different dimensions), given the coordinates to modify in a 1d array, and the new value ? 给定要在一维数组中修改的坐标和新值,如何以通用方式更新多维数组(具有不同维度)?

Examples : 例子 :

I can have as parameter 我可以作为参数

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

And i want to do 我想做

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

All that in the least lines of code possible (no switch case checking the coordinates_array length). 只需最少的代码行即可完成所有操作(无需检查case_array长度)。

I have found a solution : 我找到了解决方案:

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);
}

But i'm not quite satisfied with it. 但是我对此不太满意。 Can anyone find a better solution ? 谁能找到更好的解决方案?

Or can anyone tell me if my approach is good performance wise. 或者有人可以告诉我,我的方法是否明智。 I'll call this method very often : more than 700 multidimentional arrays in total, and they can all be uptated very often (like when i resize a div, i need to update 4 different arrays (top, left, width, height), ...). 我会经常调用此方法:总共有700多个多维数组,而且它们都可以经常更新(例如,当我调整div的大小时,我需要更新4个不同的数组(顶部,左侧,宽度,高度), ...)。


After several perf tests, I decided to go for an 'ugly' switch case : 经过几次性能测试后,我决定使用一个“丑陋”的开关盒:

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

Indeed, for a simple calling test over 100 000 iterations, the switch case solution revealed to be over 500x faster than the eval() one (10ms to complete the switch case vs over 5000ms to complete the eval test). 确实,对于一个经过100 000次迭代的简单调用测试,切换案例解决方案的速度比eval()快500倍(完成切换案例需要10毫秒,而完成eval测试则超过5000毫秒)。

If anyone finds a cleaner solution than the switch case one, i'm still interested, even if it's a little bit less performant (not more than ~2x ; 3x times though). 如果有人能找到比开关案例更干净的解决方案,我仍然会感兴趣,即使它的性能稍差一点(不超过2倍;不过是3倍)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM