【问题标题】:How to reference an array in a function argument如何在函数参数中引用数组
【发布时间】:2011-12-19 22:23:30
【问题描述】:

我有一系列数组,其中包含我想在各种 HTML div 中用作文本的单词(其中大约有 35 个,为简洁起见,我只包括了几个)。

var bodyplan = ['Anguilliform', 'Compressiform', 'Depressiform', 'Filiform', 'Fusiform', 'Globiform', 'Sagittiform', 'Taeniform'];

var mouthposition = ["Inferior", "Jawless", "Subterminal", "Superior", "Terminal"];

var barbels = ['1', '2', '4 or more'];

var caudalshape = ['Continuous', 'Emarginate', 'Forked', 'Lunate', 'Rounded', 'Truncate'];

我有一个 switch 函数,它应该根据用户的选择来改变文本:

switch(n){
            case 1:
            changelabels(bodyplan, 8);
            break;
            case 2:
            changelabels(mouthposition, 5);
            break;
            case 3:
            changelabels(barbels, 3);
            break;
            case 4:
            changelabels(caudalshape, 6);
            break;
            case 5:
            changelabels(dorsalspines, 8);
            break;
            default:
            alert("handquestsel error")}};

最后,我有了想要更改的功能(除非它没有):

function changelabels(opt1,opt2){
    var i = opt2;
    var im = opt2 - 1;
    var c = 1;
    var index = 0;
    while (i>=c){   
        var oldlbl = document.getElementById("rb" + c + "lbl");
        var newlbla = opt1.slice(im,i);
        var newlblb = opt1.toString();
        oldlbl.innerHTML = newlblb; 
        c = c + 1
        index = index + 1
}};

我知道我的函数的代码在这一点上是完全错误的,但我已经修改了很多次,以至于我不确定发生了什么。在某一时刻,我确实拥有能够更改文本的函数,但它做得不正确(它解析了数组的名称,而不是像我希望的那样从数组中提取值)。请帮忙。我知道我在这里忽略了一些基本概念,但不确定哪些。我已经数不清我花了多少时间试图弄清楚这一点。看起来它应该如此简单,但在我所有混乱的尝试中,我还没有找到答案。

编辑:我希望我的 switch 语句调用函数并传递给函数,从中提取标签的适当数组。该应用程序的目的是帮助用户学习识别鱼。当用户在页面上进行选择时,将针对各种字符状态显示一系列图片,并附有描述状态的标签。例如,当用户选择嘴巴位置时,一系列 div 将显示鱼的不同嘴巴位置,并在图片下方有一个标签,告诉用户该特定角色状态被称为什么。我可以很好地改变图片,但我在标签上玩得很开心。

【问题讨论】:

  • “但我已经修改了很多次,以至于我不确定发生了什么”,即当你从办公桌上站起来,在大楼里走来走去 4 次,然后再回来。
  • 你的最终目标是什么?更清楚地说明这一点可以帮助我们确定更好的解决方案。
  • 我想帮忙,但我不知道你想做什么。您能否详细说明一下,或许可以为我们提供更多背景信息?

标签: javascript arrays function parameters


【解决方案1】:

为什么不只是类似的东西:

document.getElementById("bodyplan_label").innerHTML = bodyplan[bodyplan_index];

您似乎试图将所有内容放入真正抽象的数据结构中,我认为没有理由这样做。保持简单。

另外,bodyplan 只有 8 个元素,所以bodyplan[8] 会给你一个out of bounds exception,因为数组从0 开始,这在所有现代编程语言中都很常见。

【讨论】:

  • 我试过这个。问题似乎与访问数组有关。例如,如果我这样声明:'document.getElementById("bodyplan_label").innerHTML = "bodyplan[bodyplan_index]";'标签更改为双引号内的字符串。但是当我拿走报价并尝试它时,什么也没有发生。该语句用于更改标签。但是,只有当我给它一个字符串来改变它。我检查了我的数组声明以确保我使用了正确的语法,但它们似乎无法访问。
  • 我对范围问题的怀疑得到了证实。我将数组移动到更改标签函数中,一切正常。由于某种原因,我在页面顶部声明的全局变量并不是真正的全局变量。我不知道为什么会这样。
  • "bodyplan[bodyplan_index]"表示实际字符串bodyplan[bodyplan_index]bodyplan[bodyplan_index]表示数组bodyplan_index位置bodyplan_index的值
  • 当我将数组向下移动到使用它的函数中而不是将其作为页面顶部的全局函数时,问题就解决了。我不知道为什么会这样,但显然在 javascript 中使用全局变量会导致问题。我在 VisualBasic(我熟悉的唯一其他语言)中从来没有遇到过这样的问题,但确实如此。
【解决方案2】:

如果我正确阅读了您的要求和代码,则在您的 switch 语句中,您将传递对适当数组的引用和该数组的预期长度 - 您不需要第二个参数,因为所有 JavaScript 数组都有一个 @987654321 @。

您不想使用.slice() 从数组中获取单个值,因为这会返回一个从原始数组中复制出来的新数组——只需使用arrayVariable[index] 来获取index 中的单个项。

因此,将它们放在一起尝试这样的事情(使用您现有的数组定义):

switch(n){
   case 1:
      changelabels(bodyplan);
      break;
   case 2: 
      changelabels(mouthposition);
   // etc.
}

function changelabels(data) {
   var i,
       lbl;

   for (i = 0; i < data.length; i++) {
      lbl = document.getElementById("rb" + (i+1) + "lbl");
      lbl.innerHTML = data[i];
   }
}

注意这比你的代码简单多少?我在这里假设您要更新的元素的 id 格式为“rb1lbl”、“rb2lbl”等,编号从 1 开始:我使用 (i+1) 获取这些 id,因为 JavaScript 数组索引从零。另请注意,您甚至不需要 lbl 变量:您可以直接说 document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i] - 但是我将其保留在其中,以便我们在下面进行扩展...

在您的函数中,您似乎正在更改一组元素上的标签(单选按钮标签?),数组中的每个值一个,但是当您用完数组项时您会停止,这意味着任何剩余元素仍将保留上一个选择的值(例如,如果上一个选择是带有 8 个选项的“bodyplan”,而您更改为只有 5 个选项的“mouthposition” - 您可能应该隐藏 3 个剩余元素,否则这些元素将继续显示最后几个“bodyplan” " 项目。一种方法是不要根据数组长度设置循环,而是可以循环遍历元素,如果当前元素的索引超出数组末尾,则隐藏它,如下所示:

function changelabels(data) {
   var i,
       lbl,
       elementCount = 20; // or whatever your element count is

   for (i = 0; i < elementCount; i++) {
      lbl = document.getElementById("rb" + (i+1) + "lbl");
      if (i < data.length) {
         lbl.innerHTML = data[i];
         lbl.style.display = "";
      } else {
         lbl.innerHTML = "";
         lbl.style.display = "none";
      }
   }
}

如果这些元素是单选按钮的标签(只是基于 id 的猜测),那么您还想隐藏或显示相应的单选按钮,但我希​​望您能弄清楚如何添加几行以上是为了做到这一点。

(如上所述,当数组索引从 0 开始时,请注意元素 id 从 1 开始计数。)

如果上述方法不起作用,请发布(至少部分)相关的 HTML - 显然我只是不得不猜测它可能是什么样的。

【讨论】:

  • 感谢大家的回复。我今天要试试这些东西,我会发布结果。如果我不能让它工作,我只会对更改进行硬编码并继续前进。
  • 我采纳了您的建议。数组仍然无法访问。我可以让 innerHTML 语句直接将标签更改为字符串。例如:'document.getElementById("rb" + (i+1) + "lbl").innerHTML = "string"'。但是,如果我尝试引用数组 '....innerHTML = bodyplan[i]" 它不起作用。由于某种原因,我无法访问该数组,如果我知道为什么我会被诅咒的。我是新手编程,但我想要做的并不是很困难。在此之前我几乎没有遇到任何问题,我为此编写了几页代码。但是我尝试访问数组的这一部分失败了。
  • 我对范围问题的怀疑得到了证实。我将数组移动到更改标签函数中,一切正常。由于某种原因,我在页面顶部声明的全局变量并不是真正的全局变量。我不知道为什么会这样。
  • 我很高兴它现在可以工作了,但真正的全局变量是全局的——你的代码肯定有其他问题。例如,您从未显示过 switch 语句的上下文,但不一定是这样。不过,我希望你至少接受我关于使用数组.length 属性的建议,而不是使用.slice()(在这种情况下)等等。您的原始代码比必要的要复杂得多。祝你好运!
【解决方案3】:

解决方案:将数组变量的范围更改为本地,方法是将它们移动到使用它们的函数中,而不是将它们作为页面顶部的全局变量。我不明白,因为我遵循了变量声明的每一条规则。但是由于一些未知的原因,javascript 中的全局变量是可恶的。

解决方案编辑:在声明我的全局变量时发现错误。这可能是我无法访问它们的问题的根源。但这不是问题,因为我更正了我的代码。

【讨论】:

  • 在任何语言中将全局变量保持在最低限度是一种很好的编程实践,但这是组织和模块化的问题,而不是避免语言中不可靠部分的方法。 全局变量 do 在 JavaScript 中工作 - 它没有什么技巧。当然,我很高兴你的程序能正常工作,但一定有其他问题导致它停止工作。如果我们可以在上下文中看到您的所有代码,我怀疑您的“未知原因”可能会被这里更有经验的 JavaScripters 解释 - 也许您可以将其粘贴到 jsbin.com
【解决方案4】:

我不明白你试图用你的代码实现什么。但是要通过引用传递变量(在本例中为数组),您只需在变量前添加“&”即可。

function the_name(&$var_by_ref, $var_by_value) {
// Here if you modify $var_by_ref this will change the variable passed to the function.
}

更多:http://php.net/manual/en/language.references.pass.php

希望对您有所帮助。

【讨论】:

  • 在 JavaScript 中数组总是通过引用传递,因为它是一个对象。通过引用指示符&amp; 不存在。
猜你喜欢
  • 2020-11-27
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多