【问题标题】:Javascript function and array problemJavascript函数和数组问题
【发布时间】:2011-01-19 23:05:43
【问题描述】:

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

在我分配任何数组值之前,我可以让 alert() 弹出,但它似乎在那一点上死了。任何帮助表示赞赏。

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

【问题讨论】:

  • 数组返回什么?此外,这对我来说看起来不太像一个数组,因为它使用字母 o 作为索引而不是 0
  • a1 = "1" b1 = "2" a_status 和 b_status = "ok"
  • 对于数组,那些 'o' 被替换为 1/0,编辑帖子以反映这一点。
  • @David: “对于数组,那些 'o's 被替换为 1/0,编辑帖子以反映这一点。” 除了现在,你有 '1''2',看不到'0'...
  • @David: status 仍然是 so。无论如何,您都会收到错误消息。

标签: javascript jquery multidimensional-array


【解决方案1】:

你不能这样初始化数组。每个级别都需要单独初始化。而且由于您没有数字键,我会改用object

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

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


if 语句可以使用conditional operator 写得更短:

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 开头,那么结构会变得非常混乱。

【讨论】:

  • 不知道为什么我没有发表评论,但这很有效。感谢您的帮助。
【解决方案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 函数将在每次调用时创建一个 数组。这似乎效率极低。
  4. JavaScript 数组并不是真正的数组,它们只是具有一些特殊功能的对象。您可能只需要对象,因为并非所有键都是数字的。但是,如果您真的想要数组,它们大多以索引 0 而不是 1 开头。
  5. 你说得对,数组索引实际上是字符串,但它们几乎总是写成数字,这样做完全没问题(不加引号)。使用引号(这在技术上也是正确的)往往会使试图维护代码的人感到困惑。 (但如果你使用对象而不是数组,它会很有帮助。)

【讨论】:

    【解决方案3】:

    首先,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];
    }
    

    【讨论】:

      【解决方案4】:

      我并不精通需要处理多维数组,但是您需要先定义所有内部数组,然后才能将它们设置为任何内容。像这样:

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

      我试图控制这个结果,但一切都显示为未定义,但至少在数组中并且没有死。

      【讨论】:

      • 我不会像对象那样使用数组。 this_array['1']['1']['o'] = []; 在某些时候会给你带来麻烦。
      • 是的,在我看到你上面的答案之前发布了这个,我认为这是 javascript 的一个更好的选择,因此赞成 heh
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2011-02-22
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多