问题描述
我有一个函数,经常调用多维数组中的多个值,例如array[idx][3] 。为了节省空间,我想在函数的开头用这些值定义变量,如下所示:
var na = array[idx][1];
var sc = array[idx][2];
...
我认为,如果可以创建一个变量名数组-> var tmp = ['na','sc',...];这样会更快var tmp = ['na','sc',...];
,创建一个for循环并遍历名称数组和多维array ,即:
for(i = 0; i = 7, i++){
var tmp[i] = array[idx][i];
}
可能吗?
1楼
您可以使用
array存储密钥。然后使用
Object创建一个key-> value映射。然后使用
obj.key(如果键是固定的)或obj[key](如果键是一个计算值)top来获取值。在
for (i = 0; i = 7; i++) {的jsfiddle中for (i = 0; i = 7; i++) {浏览器将挂起,您应使用i < 7而不是i = 7。
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);
通过可以进一步缩短工作:
// 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);
与您的idx结合使用可能是动态的,您可以创建一个函数,给定idx和target数组,并返回带有键的对象。
// 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);