Javascript函数和数组问题

时间:2011-01-19 23:05:44

标签: javascript jquery multidimensional-array

我试图将一些数据传递给一个函数,该函数使用这些参数作为多维数组的标识符,然后返回硬编码到该数组的值。我不确定我做错了什么,但有些事情正在破裂。

在分配任何数组值之前,我可以获得一个警告()来弹出,但它似乎在那时死掉了。任何帮助表示赞赏。

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

4 个答案:

答案 0 :(得分:5)

您不能像这样初始化数组。每个级别都需要单独初始化。由于您没有数字键,我会使用object代替:

var this_array = {
    '1': {
        '1': {
            'o': {
              '1': "10",
              '2': "20"
            }
        },
        '2': {
            'o': {
              '1': "40",
              '2': "60"
            }
        }
    }
};

如果密钥不存在,您还必须定义会发生什么。例如。目前,如果status's',那么您将收到错误。


使用conditional operator

可以缩短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应该做什么,或者我会提供替代功能。一些想法:

  1. 创建一个数组,使用[](或new Array(),但这只是同一事物的更长形式。)
  2. 您必须在数组中创建每个对象/数组。因此,在this_array['1']['1']['o']['1']this_arraythis_array['1']this_array['1']['1']创建对象/数组之前,您无法分配到this_array['1']['1']['o']
  3. 您的this_function函数每次调用时都会创建一个 new 数组。这似乎效率极低。
  4. JavaScript数组不是真正的数组,它们只是具有一些特殊功能的对象。您可能只想要对象,因为并非所有键都是数字键。但是,如果你真的想要数组,它们通常以索引0而不是1开头。
  5. 你是完全正确的,数组索引实际上是字符串,但它们几乎总是写成数字,这样做完全没问题(不用引号)。使用引号(这在技术上也是正确的)将会使试图维护代码的人感到困惑。 (但是如果你使用对象而不是数组,它将主要帮助。)

答案 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";

我试图控制这个结果,所有内容都是未定义的,但至少在数组内并没有死。