使用变量引用数组

时间:2014-05-21 15:51:18

标签: javascript arrays variables reference

我正在编写一个页面,用于收集装配中安装的零件的序列号。我想在客户端验证用户输入,如果可以的话。

所以,如果我有多个密集的arrarys,我如何使用变量来引用它们?例如,假设我有三个密集排列的数组,其名称代表部件号,而谁的值代表序列号(已在其他程序集中使用)。

arr_PN-123-ABC = ('SN0123','SN0124','SN0125')
arr_PN-456-DEF = ('SN00333','SN00334','SN00335')
arr_PN-789-GHI = ('SN-0001','SN-0002','SN-0003','SN-0004')

function fcnValidateSN(_givenPN, _givenSN) {

  //make sure the given values are not null or empty...

  //derive the array of serial numbers that coorsponds to the given part number...
  var vArrName = "arr_" + vGivenPN;

  //loop thru the array of serial numbers to determine if the given sn was already used...
  for(var x=0; x < vArrName.length(); x++) {
    if(vArrName[x]==_givenSN) {
      alert("Serial number '" + _givenSN + "' was already used in another assembly.");
      theForm.txtPN.focus();
      return;
    }


  } //end 'for' loop

} //end fcnValidateSN()

问题在于&#39; vArrName&#39;是一个值为&#39; arr _&#39;的字符串。而不是引用数组的名称是&#39; arr _&#39;。

我尝试用eval()函数包装它,但是eval()将破折号视为减号。

另一个注意事项:我不能使用jquery来完成这项工作。

谢谢

3 个答案:

答案 0 :(得分:1)

您无法生成对使用var声明的变量的引用(除了下面的内容)。您可以使用动态属性名称来引用对象的属性,因此:

var arrays = {
  "arr_PN-123-ABC": ['SN0123','SN0124','SN0125'],
  "arr_PN-456-DEF": ['SN00333','SN00334','SN00335'],
  // ...
};

然后:

console.log( arrays["arr_PN-" + num + "ABC"][0] ); // SN0123

请注意,您不能使用&#34; - &#34;在变量名中,但可以在对象属性名称中使用它。

在浏览器中为全局变量设置了无法通过动态名称访问var变量的异常。这些变量最终都是window对象的属性。

答案 1 :(得分:0)

使用具有数组作为元素的单个对象:

var arr_PN = {
    '123-ABC': ('SN0123','SN0124','SN0125'),
    '456-DEF': ('SN00333','SN00334','SN00335'),
    '789-GHI': ('SN-0001','SN-0002','SN-0003','SN-0004')
}

然后使用:

参考
var vArrName = arr_PN->{vGivenPN};

答案 2 :(得分:0)

  • JavaScript中的数组由[]分隔,而不是()
  • 有效的JavaScript变量名称不能包含“ - ”
  • 数组的长度属性不是函数

好吧,我已经对你的代码进行了一些(实际上,很多)调整,但我认为这就是你需要的:

var serialGroups = {
  PN_123_ABC: ['SN0123','SN0124','SN0125'],
  PN_456_DEF: ['SN00333','SN00334','SN00335'],
  PN_789_GHI: ['SN-0001','SN-0002','SN-0003','SN-0004']
};

function validateSerial(groupName, sn) {
  var serials = serialGroups[groupName];

  for(var i=0; i < serials.length; i++){
    if(serials[i] == sn) {
      alert("Serial number '" + sn + "' was already used in another assembly.");
      //Do whatever you want here
      return;
    }
  }
}