Javascript array to VBScript

2019-07-20 14:39发布

问题:

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
%>

回答1:

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
%>


回答2:

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



回答3:

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
%>


回答4:

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>