我有一个使用 Javascript 构建的对象数组,我需要使用 VBScript 读取它(如下例所示)。我找不到在 VbScript 代码中循环遍历数组作为
myArray
对象的方法。
这个例子是我的问题的简化。我无法更改页面的默认语言。
myArray
对象必须使用 JavaScript 构建。该数组必须使用内联 vbscript 输出。
<%@ Language="VBScript" %>
<script language="javascript" runat="server">
var myArray = [
{
name: "object 1"
},
{
name: "object 2"
},
{
name: "object 3"
}
];
</script>
<%
Response.Write(myArray) ' [object Object],[object Object],[object Object]
'Response.Write(myArray(0)) ' ERROR
'Response.Write(myArray[0]) ' ERROR
Response.Write(myArray.[0]) ' [object Object]
Response.Write(myArray.[0].name) ' object 1
Response.Write(VarType(myArray)) ' 8
Response.Write(myArray.length) ' 3
Response.Write(VarType(myArray.[0])) ' 8
Response.Write(VarType(myArray.[0].name)) ' 8
Response.Write(TypeName(myArray)) ' JScriptTypeInfo
Response.Write(TypeName(myArray.[0])) ' JScriptTypeInfo
' ERROR
' Type mismatch: 'UBound'
'Response.Write(UBound(myArray))
' ERROR
' Object doesn't support this property or method: 'myArray.i'
'Dim i
'For i = 0 To myArray.length - 1
' Response.Write(myArray.[i])
'Next
%>
虽然有点晚了,但您可以向标准 javascript 数组添加自定义方法。此方法在 VBscript 中也可用。 因此,将此代码添加到您的脚本中:
// add an Item() method to the standard array object so we can iterate arrays in VBscript.
Array.prototype.Item = function(idx) {
return this[idx];
};
您可以使用:
myArray.Item(0)
在 VBscript 中获取数组中的一项。
HTH
看来 JScript 数组方法仍然可以通过 VBScript 使用:
<script language="javascript" runat="server">
var myArray = [
{
name: "object 1"
},
{
name: "object 2"
},
{
name: "object 3"
}
];
</script>
<%
Do While myArray.length > 0
response.write myArray.shift().name
response.write "<br>"
Loop
%>
不要使用数组。使用如下字典对象。
<%@ Language="VBScript" %>
<script language="javascript" runat="server">
var myArray = [
{
name: "object 1"
},
{
name: "object 2"
},
{
name: "object 3"
}
];
var myDictionary = Server.CreateObject("Scripting.Dictionary");
for (var myArrayIndex = 0; myArrayIndex < myArray.length; myArrayIndex++) {
myDictionary.Add(myArrayIndex, myArray[myArrayIndex]);
}
</script>
<%
Dim i
For i = 0 To UBound(myDictionary.Keys)
Response.Write(myDictionary.Item(i).name)
Next
%>
您可以将打印委托给 JScript 函数:
<%@ Language="VBScript" %>
<script language="javascript" runat="server">
var myArray = [
{
name: "object 1"
},
{
name: "object 2"
},
{
name: "object 3"
}
];
</script>
<%
'// vbscript
Response.Write(TypeName(myArray)) ' JScriptTypeInfo
Response.Write printArr(myArray)
'// more vbscript
%>
<script language="javascript" runat="server">
function printArr(arr)
{
for (var i = 0; i < myArray.length; i++)
{
Response.Write("<br />index " + i + " = " + myArray[i].name);
}
}
</script>
对于在当今这个时代面临同样问题的人(距离提出问题已经 9 年了),JScript 有一个内置的
Array.prototype.at()
可以满足这个确切的目的,所以,从 OP 的代码来看:
For i = 0 To myArray.length - 1
Response.Write(myArray.at(i))
Next
无需任何额外的操作。我认为当问题被提出时这应该会起作用,因为我相信从那时起实施并没有改变 ECMA 版本。
对于 Microsoft 声称的内容,JScript 是 ECMAScript3(web archive)的实现,因此希望 MDN 中声称与 ECMAScript3 兼容的任何内容都应该在 JScript 中工作,即使现在 MDN 也是一个很棒的(并且是最新的) !) JScript 语法参考。
也许可以在 https://tc39.es/ecma262/
找到 ECMAScript 第 3 版或 ECMA-262 的最好的、维护的和特定的文档。