Javascript等效的VBS redim保留

时间:2015-11-08 04:58:09

标签: javascript asp.net arrays vbscript vb6-migration

我正在尝试将一些旧的VBScript重写为ASP.NET应用程序的Javascript,并且有一行我不确定如何翻译,而且我甚至不完全肯定它正在做什么。

应用程序本质上允许用户输入新的员工编号以添加到数据库,然后为其分配用户权限。不要问我为什么代码是如此混乱,我最初没有写它,我只是想让它在Chrome中运行

这是我到目前为止翻译的相关代码:

if(form1.txtEmpno.value != ""){
var oOption;
oOption = document.createElement("OPTION");
oOption.text=form1.txtEmpno.value;
oOption.value=form1.txtEmpno.value;
form1.lstActive.add (oOption);
oOption = document.createElement("OPTION");
oOption.text="";
oOption.value="";
form1.lstPerms.add (oOption);
redim preserve arrUsers(1,ubound(arrUsers,2)+1);
arrUsers(0,ubound(arrUsers,2)) = form1.txtEmpno.value;
arrUsers(1,ubound(arrUsers,2)) = "";
form1.txtEmpno.value = "";
oOption = null;
}

这是有问题的一行:

redim preserve arrUsers(1,ubound(arrUsers,2)+1);

1 个答案:

答案 0 :(得分:1)

MSDN将ReDim [Preserve] varname(subscripts)定义为:

  

ReDim语句用于调整或调整已使用带有空括号的PrivatePublicDim语句正式声明的动态数组的大小(没有维度下标)。您可以重复使用ReDim语句来更改数组中的元素和维度数。

     

如果您使用Preserve关键字,则只能调整最后一个数组维度,并且根本无法更改维度数。例如,如果您的数组只有一个维度,则可以调整该维度的大小,因为它是最后一个维度。但是,如果阵列具有两个或更多维度,则可以仅更改最后一个维度的大小,并仍保留阵列的内容。

JavaScript中的数组与VBScript的数组有不同的语义,特别是因为它们实际上比真正的数组更接近vector,而且JavaScript没有提供真正的N维数组:相反,你使用交错 - 数组(数组内的数组)。这意味着您的VBScript无法语法转换为JavaScript。

这是您在VBScript中的相关代码:

ReDim Preserve arrUsers(1,ubound(arrUsers,2)+1)
arrUsers(0,ubound(arrUsers,2)) = form1.txtEmpno.value
arrUsers(1,ubound(arrUsers,2)) = ""

我们看到arrUsers是一个二维数组。这需要转换为交错数组,但是你没有发布定义和初始化arrUsers的代码,也没有发布以后如何使用的代码,所以我只能做出假设。

它看起来要在最后一个维度上添加1个元素,但代码似乎只使用[1]下标中的额外空格(即它只需要额外的维度空间来代替第0维的某些值)所有值),这使得这更简单,因为您不需要迭代每个第0维下标。

JavaScript数组有许多我们将使用的函数属性,特别是push:它将一个元素追加到数组的末尾(必要时在内部增长缓冲区),以及pop从数组中删除最后一个(索引最高的)元素(如果数组为空,则为NOOP):

var arrUsers = [ [], [] ]; // empty, staggered 2-dimensional array
...
arrUsers[0].push( form1.txtEmpno.value );
arrUsers[1].pop();

更简单。

但是,如果此数组只是存储和表示数据的某个内部模型的一部分,那么您应该利用JavaScript对象原型而不是使用数组索引,因为这会使代码自我描述,例如:

var User = function(empNo, name) {
    this.employeeNumber = empNo;
    this.name = name;
};

var users = [];
users.push( new User(1, "user 1") );
users.push( new User(23, "user 23") );

...

for(var i = 0; i < users.length; i++ ) {
    alert( users[i].name );
}