JS多维数组修改值 [英] JS multidimensional array modify value

查看:196
本文介绍了JS多维数组修改值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我有一个包含坐标和值的一维数组作为参数.

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

很遗憾,我做不到

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

因为尺寸并不总是相同的.

我可以用坐标数组的长度做一个 switch case,但这会很糟糕,因为我的 multi_dim_arrays 可以在 1D 和 10D 之间.

我尝试了什么:

function(coordinates_array, value) {var multi_dim_array = getArrayByName(another_param);//在[1][2][3]"中变换[1, 2, 3]"var coord = JSON.stringify(coordinates_array).replace(/,/g, '][');var array_value = eval('multi_dim_array'+coord);array_value = 值;}

但它不起作用

multi_dim_array[1][2][3]

未更新.

还有这个:

eval('multi_dim_array'+coord) = value;

也不起作用.

给定要在一维数组中修改的坐标和新值,如何以通用方式更新多维数组(具有不同维度)?

示例:

我可以作为参数

coordinates_array = [1, 5, 6, 7]坐标数组 = [2, 3]坐标数组 = [8]

我想做

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

所有这一切都在尽可能少的代码行中(无需检查坐标数组长度的 switch case).

解决方案

我找到了解决方案:

function(coordinates_array, value) {var multi_dim_array = getArrayByName(another_param);//在[1][2][3]"中变换[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);开关(坐标数组.长度){情况 1: multi_dim_array[coordinates_array[0]] = value;break;情况 2: multi_dim_array[coordinates_array[0]][coordinates_array[1]] = value;break;情况 3: multi_dim_array[coordinates_array[0]][coordinates_array[1]][coordinates_array[2]] = value;break;案件.....}}

确实,对于超过 100 000 次迭代的简单调用测试,开关案例解决方案显示比 eval() 解决方案快 500 倍以上(完成开关案例需要 10 毫秒,而完成 eval 测试需要超过 5000 毫秒).

如果有人找到比 switch case 更简洁的解决方案,我仍然感兴趣,即使它的性能稍差(不超过 ~2x;不过 3x 倍).

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, ...).

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.

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

解决方案

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), ...).


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

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

这篇关于JS多维数组修改值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆