Javascript使用数组中的名称定义变量

时间:2015-08-07 15:46:10

标签: javascript arrays loops variables multidimensional-array

我有一个函数,其中来自多维数组的多个值经常被调用,如array[idx][3] ..为了节省空间,我想在函数的开头用这些值定义变量,如下所示: / p>

var na = array[idx][1];
var sc = array[idx][2];
...

我认为如果可以创建一个变量名称数组会更快 - > var tmp = ['na','sc',...];,创建一个for循环并循环遍历名称数组和多维array,即:

for(i = 0; i = 7, i++){

var tmp[i] = array[idx][i];

}

有可能吗?

1 个答案:

答案 0 :(得分:1)

  1. 您可以使用array存储密钥。

  2. 然后使用Object创建密钥 - >价值映射。

  3. 然后使用obj.key(如果密钥已修复)或obj[key](如果密钥是计算值),则获取值。

  4. 在你的jsfiddle中for (i = 0; i = 7; i++) {会挂起浏览器,你应该使用i < 7代替i = 7

  5. var keys = ['na', 'sc', 'kd', 'wi', 'ki', 'de', 'sh', 'ti'];
    var values = {};
    
    var i, key, len;
    // Prevent using magic number 7, get the length from the keys.
    for (i = 0, len = keys.length; i < len; i++) {
      values[keys[i]] = i;
    }
    alert(values.na);

    可以通过Array.prototype.forEach进一步缩短作品:

    // Create map store.
    var v = {};
    // Loop through the array
    ['na', 'sc', 'kd', 'wi', 'ki', 'de', 'sh', 'ti'].forEach(function(key, idx) {
        v[key] = idx;
    });
    alert(v.na);
    

    jsfiddle

    与你的idx结合可能是动态的,你可以创建一个函数,给定idx和目标数组,用键返回对象。

    // A list to simulate what you mentioned with array[idx][i].
    var demoList = [
        ['na - 0', 'sc - 0', 'kd - 0', 'wi - 0', 'ki - 0', 'de - 0', 'sh - 0', 'ti - 0'],
        ['na - 1', 'sc - 1', 'kd - 1', 'wi - 1', 'ki - 1', 'de - 1', 'sh - 1', 'ti - 1'],
        ['na - 2', 'sc - 2', 'kd - 2', 'wi - 2', 'ki - 2', 'de - 2', 'sh - 2', 'ti - 2'],
        ['na - 3', 'sc - 3', 'kd - 3', 'wi - 3', 'ki - 3', 'de - 3', 'sh - 3', 'ti - 3'],
        ['na - 4', 'sc - 4', 'kd - 4', 'wi - 4', 'ki - 4', 'de - 4', 'sh - 4', 'ti - 4'],
        ['na - 5', 'sc - 5', 'kd - 5', 'wi - 5', 'ki - 5', 'de - 5', 'sh - 5', 'ti - 5'],
        ['na - 6', 'sc - 6', 'kd - 6', 'wi - 6', 'ki - 6', 'de - 6', 'sh - 6', 'ti - 6'],
        ['na - 7', 'sc - 7', 'kd - 7', 'wi - 7', 'ki - 7', 'de - 7', 'sh - 7', 'ti - 7']
    ];
    
    var getResult = function(idx, array) {
        var v = {};
        // Only create the mapping if input array and array[idx] are both array.
        if (Array.isArray(array) && Array.isArray(array[idx])) {
            ['na', 'sc', 'kd', 'wi', 'ki', 'de', 'sh', 'ti'].forEach(function(key, i) {
                v[key] = array[idx][i];
            });
        }
        return v;
    };
    
    var v = getResult(1, demoList);
    alert(v.na);