如何在函数参数中引用数组

How to reference an array in a function argument

本文关键字:引用 数组 参数 函数      更新时间:2023-09-26

我有一系列数组,其中包含我想在各种HTMLdiv中用作文本的单词(大约有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(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将显示鱼的不同嘴巴位置,并在图片下方有一个标签告诉用户特定的字符状态被称为什么。我可以把照片改得很好,但我在标签上遇到了麻烦。

为什么不这样写呢

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

你似乎试图把所有的东西都放在抽象的数据结构中,我看没有理由这样做。简单点就好。

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

如果我正确地阅读了您的要求和代码,在您的开关语句中,您正在传递对适当数组和该数组的预期长度的引用-您不需要第二个参数,因为所有JavaScript数组都有.length属性。

您不希望使用.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];
   }
}

注意到这比你的代码简单多了吗?我在这里假设你正在更新的元素有一个格式为"rb1lbl","rb2lbl"等的id,编号从1开始:我使用(I +1)得到这些id,因为JavaScript数组索引从零开始。还需要注意的是,你甚至不需要lbl变量:你可以直接说document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i]——但是我保留了它,以便我们可以在下面展开…

函数中你似乎改变元素的标签在一组(单选按钮标签?),每个值数组中的一个,但是你停止当您运行的数组项这意味着任何剩余的元素仍将保存的值从先前的选择(例如,如果之前的选择是与8"型线"选项,你就改变了"mouthposition"只有5 -你应该隐藏3剩下的元素,否则继续显示过去的几个"型线"项目。一种方法是不根据数组长度设置循环你可以遍历元素,如果当前元素的索引超出了数组的末尾隐藏它,像这样:

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 -显然,我只是不得不猜测它可能是什么样子。

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

解决方案编辑:发现一个错误,声明我的全局变量。这可能就是我为什么不能访问它们的问题的根源。但是,在这一点上,这是一个没有问题,因为我纠正了我的代码。

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

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

希望对你有帮助。