I have an array of objects built using Javascript and I need to read it using VBScript (as in the example below). I cannot find a way to loop through the array in my VbScript code as the myArray
object.
The example is a simplification of my problem. I cannot change the default language of the page. The myArray
object must be built using javascript. The array must be output using inline 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
%>
It seems the JScript array methods are still available via 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
%>
A little late to the party, but you can add a custom method to the standard javascript Array. This method will then also be available in VBscript.
So add this code to your script:
// add an Item() method to the standard array object so we can iterate arrays in VBscript.
Array.prototype.Item = function(idx) {
return this[idx];
};
And you can use:
myArray.Item(0)
to get to one of the items in the array in VBscript.
HTH
Don't use arrays. Use a dictionary object as below.
<%@ 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
%>
You can delegate the printing to a JScript function:
<%@ 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>