1

编辑:原来我的 JavaScript 函数没有像我想象的那样工作,但是请在我修复 JavaScript 时帮助解决 ASP 问题。

编辑 2: 使用 alert(JSON.stringify(sales)) 查看我得到的对象:

{"712":{"KR":1,"LR":0},"713":{"KR":1,"LR":0}}

编辑3:

需要重新编写我的销售脚本,我正在尝试使用对象,但它似乎不起作用,因为我对这部分 JS 没有太多经验。

var products = { 
    "KR" : 4,
    "LR" : 6 
};
var sale = [ ];

function sale(id,product,value) 
{
    this.id = function prod(product,value) 
    {
        this.product = product;
        this.value = value;
    }
}

sale("N51","KR",0);

希望您能看到我正在尝试做的事情,但这可能是非常错误的。

感谢您的长篇文章,它非常有帮助,只要上面的代码工作,我就会处理所有这些


好的,我有这个 JavaScript 脚本,它将整理单个图像的销售情况。

712 和 713 是图像 ID。然后 KR 和 LR 是产品,如果它们确实有销售,它只会将它们添加到 URL 变量中。

function submitSales() 
{
    //URL Variable
    var urlVariable = "?sales=";

    for (x in sales)
    {
        urlVariable = urlVariable + x + "-";
        for (s in sales[x])
        {
            if (sales[x][s] > 0)
            {
                urlVariable = urlVariable + s + ":" + sales[x][s] + ",";
            }
        }
    }
    urlVariable = urlVariable.substring(0, urlVariable.length - 1);
}

如果我添加 3 种产品的销售额,我会得到以下字符串:?sales=712-KR:1,LR:1,713-KR:1

现在,首先分离两个图像销售的最佳方法是什么,所以我将留下:

712-KR:1,LR:1 713-KR:1

然后我真的需要将它们放在一个看起来像这样的数组中:

image(0) = 712 = product(0) = KR = 1
                 product(1) = LR = 1
image(1) = 713 = product(0) = KR = 1

我真的不知道 ASP 数组是如何工作的那么好,从我读到的它们实际上很烂。

4

1 回答 1

0

我真的不知道 ASP 数组是如何工作的那么好,从我读到的它们实际上很烂。

他们这样做,但在这种情况下,这并不重要。

一般资料

首先,您的 JavaScript 是错误的。

  • x并且s从不声明,因此它们是全局的。不要这样做,总是用 . 声明所有变量var
  • 您没有正确编码 URL 参数。这势必会爆炸,始终使用正确的编码(encodeURIComponent()在这种情况下)。
  • 避免依赖全局变量。将sales变量作为参数传入。
  • 避免使用裸for .. in迭代对象。用作hasOwnProperty()安全预防措施。这是防止对象原型被扩展的好习惯。each()或者,使用为您提供通用功能的众多 JS 库之一。Underscore.js、Sugar.js、jQuery,都提供了这样的功能。或者自己写一个,就像我在下面做的那样。

其次,ASP 已经很好地解决了这个问题。

如果您在查询字符串中传递多个具有相同名称的参数,服务器会将它们放入一个集合中。(事实上​​,这个Request对象总是包含集合,即使你只传入一个 URL 参数一次。)

所以当你查询

http://foo/bar?sale=712-KR%3A1&sale=712-LR%3A1&sale=713-KR%3A1

注意编码:

那么 ASP 引擎将在一个集合中提供三个不同的值,如下所示:

"712-KR:1", "712-LR:1", "713-KR:1"
  • 这个集合是基于 1 的,所以Request("sale")(1)会是"712-KR:1"这样,依此类推。
  • 您可以使用Request("sale").Count来找出有多少具有任何给定名称的参数。

在这一点上,我建议两件事。

  • 重写您的客户端代码,以便它发送多个具有相同名称的参数。
  • 切换到ASP 端的字典,而不是尝试使用数组。

客户

js Helper(如果您已经在使用库,这实际上可能是不必要的)

function each(obj, callback) {
    var key;

    for (key in obj) {
        if (obj.hasOwnProperty(key)) {
            callback(key, obj[key]);
        }
    }
}

js

function submitSales(sales) {
    var urlVariable, params = [];

    each(sales, function (saleId, sale) {
       each(sale, function (itemId, val) {
           var param = saleId + "-" + itemId + ":" + val;

           if (val > 0) {
               params.push( encodeURIComponent(param) );
           }
       });
    });

    urlVariable = "?sale=" + params.join("&sale=");

    // ...
}

服务器

ASP 助手

Function NewDict() 
    Set NewDict = Server.CreateObject("Scripting.Dictionary")
End Function

Function Count(ary)
    If IsArray(ary) Then
        Count = UBound(ary) - LBound(ary) + 1
    Else
        Count = vbEmpty
    End If
End Function

ASP

Function ParseSales(params) 
    Dim sales, sale, parts, saleId, value, product

    Set sales = NewDict()

    For Each sale In params
        parts = Split(sale, "-")
        saleId = parts(0)

        ' let's be careful and do a sanity check 
        If Count(parts) = 2 and IsNumeric(saleId) Then
            product = Split(parts(1), ":")

            If Count(product) = 2 Then
                If Not sales.Exists(saleId) Then
                    sales.Add saleId, NewDict()
                End If

                sales(saleId).Add product(0), product(1)
            Else
                ' Invalid parameter format, react accordingly
            End If
        Else
            ' Invalid parameter format, react accordingly
        End If
    Next

    Set ParseSales = sales
End Function

现在你可以在服务器端做各种各样的事情了

Dim sales, saleId
Set sales = ParseSales(Request("sales"))

Response.Write sales.Exists("712")        ' -> True
Response.Write sales.Exists("714")        ' -> False
Response.Write sales("712").Count         ' -> 2
Response.Write sales("712")("KR")         ' -> 1
Response.Write sales("712").Exists("XR")  ' -> False

Response.Write Join(sales.Keys(), "; ")         ' -> 712; 713
Response.Write Join(sales("712").Keys(), "; ")  ' -> KR; LR

For Each saleId In sales
    ' saleId will be "712" and so on, use sales(saleId) to get the 
    ' actual object and do something with it
Next
于 2013-07-31T17:29:09.167 回答