我试图将一些数据传递给一个函数,该函数使用这些参数作为多维数组的标识符,然后返回硬编码到该数组的值。我不确定我做错了什么,但有些事情正在破裂。
在分配任何数组值之前,我可以获得一个警告()来弹出,但它似乎在那时死掉了。任何帮助表示赞赏。
// Get Column A's number
var a1 = Number($('#p-a').attr("numb"));
// Get Column B's number
var b1 = Number($('#p-b').attr("numb"));
// Get status for column A
var a_status = $('#p-a').attr("status");
// Get status for column A
var b_status = $('#p-b').attr("status");
// If same, status="s" else, status="i"
var status = "";
if(a_status == b_status) { status = "s"; }else{ status = "o"; }
// Get the value of the numbers + status
var a = this_function(a1, b1, status, "2");
// Update the status div
$('#status').html(a);
function this_function(a1, a2, s, p)
{
this_array = array();
this_array['1']['1']['1']['1'] = "10";
this_array['1']['1']['1']['2'] = "20";
this_array['1']['2']['1']['1'] = "40";
this_array['1']['2']['1']['2'] = "60";
//
return this_array[a1][a2][s][p];
}
答案 0 :(得分:5)
您不能像这样初始化数组。每个级别都需要单独初始化。由于您没有数字键,我会使用object代替:
var this_array = {
'1': {
'1': {
'o': {
'1': "10",
'2': "20"
}
},
'2': {
'o': {
'1': "40",
'2': "60"
}
}
}
};
如果密钥不存在,您还必须定义会发生什么。例如。目前,如果status
为's'
,那么您将收到错误。
if
语句
var status = (a_status == b_status) ? 's' : 'o';
更新:如果你真的想要一个数值数组,只要键只是数字,你就可以这样创建数组:
var this_array = [
[], // this_array[0]
[ // this_array[1]
[], // this_array[1][0]
[ // this_array[1][1]
[], // this_array[1][1][0]
[null, 10, 20] // this_array[1][1][1][...]
],
[ // this_array[1][2]
[], // this_array[1][2][0]
[null, 40, 60] // this_array[1][2][1][...]
]
]
];
你知道,如果你没有用0
开始索引,结构会变得非常混乱。
答案 1 :(得分:2)
this_function
中的数组表示法不正确(除非您拥有array
函数,该函数以您显示的形式创建数组。注意:
function this_function(a1, a2, s, p)
{
this_array = array(); // <== There is no `array` function in std. JavaScript
this_array['1']['1']['o']['1'] = "10"; // <== Unless you've created an object/array at this_array['1'] (which you haven't), this line will fail
this_array['1']['1']['o']['2'] = "20";
this_array['1']['2']['o']['1'] = "40";
this_array['1']['2']['o']['2'] = "60";
//
return this_array[a1][a2][s][p];
}
我不完全确定this_function
应该做什么,或者我会提供替代功能。一些想法:
[]
(或new Array()
,但这只是同一事物的更长形式。)this_array['1']['1']['o']['1']
,this_array
,this_array['1']
和this_array['1']['1']
创建对象/数组之前,您无法分配到this_array['1']['1']['o']
this_function
函数每次调用时都会创建一个 new 数组。这似乎效率极低。0
而不是1
开头。答案 2 :(得分:1)
首先,Javascript中没有array()
函数。我不知道它是否引用了代码的其他一些点,但是数组是通过数组构造函数new Array()
或数组文字[]
其次你使用的是不是真正的数字索引数组。
对于赋值部分:您有一个数组/对象,但深层嵌套的对象/数组是undefined
。
您的代码死于:this_array['1']['1']['o']['1'] = "10";
,因为this_array['1']
是undefined
,它不能拥有任何属性,因此链条会被破坏。
然后类型有问题。您将属性转换为Number($('#p-a').attr("numb"));
的数字,然后使用字符串作为索引。这与数组/对象混淆有关。
您需要创建一个真实数组,并使用数字索引:
// move it outside so you only
// create this beast once
var array = [ // first level
[ // second level
[ // third level
[10, 20] // fourth level
],
[
[40, 60]
]
// , [...]
]
];
function this_function(a1, a2, s, p) {
return array[a1-1][a2-1][s-1][p-1];
}
答案 3 :(得分:0)
我不太需要处理多维数组,但是你需要在将它们设置为任何内容之前定义所有内部数组。像这样的东西:
var this_array = [];
this_array['1'] = [];
this_array['1']['1'] = [];
this_array['1']['2'] = [];
this_array['1']['1']['o'] = [];
this_array['1']['2']['o'] = [];
this_array['1']['1']['o']['1'] = "10";
this_array['1']['1']['o']['2'] = "20";
this_array['1']['2']['o']['1'] = "40";
this_array['1']['2']['o']['2'] = "60";
我试图控制这个结果,所有内容都是未定义的,但至少在数组内并没有死。