Javascript从Javascript对象属性

时间:2017-12-04 19:24:07

标签: javascript html json properties

所以,我有一个Javascipt对象数组,它包含与select元素中的项对应的额外属性和信息。

当用户在下拉列表中选择一个元素时,它会在Javascipt数组中查找该项目,并且应该使用相应Javascipt对象中的相关值填充页面上的其他两个字段。

这是js函数:

    function pickedCode(who) {
        who = $(who);
        var opt = who.find(':selected');
        var val = opt.val();

        for (lc = 0; lc < codes.length; lc++) {
            var code = codes[lc];
            if (code.Id == val) {
                var amt = code.Dollars;
                alert(code.Dollars)
                $('input[field=amount]').val((amt > 0 ? amt : ''));
                $('textarea[field=text]').val(code.Text);
                break;
            }
        }
    }

...这是调用函数的HTML:

<select onchange="pickedCode(this);" name="ctl00$ContentPlaceHolder1$lstCodes" id="ctl00_ContentPlaceHolder1_lstCodes">
    <option value=""></option>
    <option value="70">3-DAY NOTICE</option>
    <option value="156">A-ABSOLUTE TRANSCRIPT</option>
    <option value="47">ABORTED EVICTION</option>
    <option value="204">ACCESS AGREEMENT</option>
    <option value="174">ADD'L SERVES/MAILINGS</option>
    <option value="124">AFF IN OPP - COMMERCIAL</option>
</select>

...这里是Javascipt数据的数组:

var codes = [{
        "Id": 70,
        "Code": "3-DAY NOTICE",
        "Text": "Initiation of Non-Payment Proceeding.",
        "Dollars": "46.20"
    }, {
        "Id": 156,
        "Code": "A-ABSOLUTE TRANSCRIPT",
        "Text": "A-ABSOLUTE TRANSCRIPT",
        "Dollars": "0.00"
    }, {
        "Id": 47,
        "Code": "ABORTED EVICTION",
        "Text": "THE MARSHAL HAD TO ABORT TODAY'S SCHEDULED EVICTION AS ",
        "Dollars": "0.00"
    }, {
        "Id": 204,
        "Code": "ACCESS AGREEMENT",
        "Text": "ACCESS AGREEMENT",
        "Dollars": "0.00"
    }, {
        "Id": 174,
        "Code": "ADD'L SERVES/MAILINGS",
        "Text": "ADD'L MAILINGS",
        "Dollars": "0.00"
    }, {
        "Id": 124,
        "Code": "AFF IN OPP - COMMERCIAL",
        "Text": "Aff in Opp - COMMERCIAL",
        "Dollars": "85.05"
    }
]

正在查找并找到合适的元素 它正在获取文本并将其正确地设置到textarea中。

问题在于属性Dollars。由于某种原因,它总是为"0.00"属性返回Dollars的值,即使对于数量大于0的项目,我也不能为我的生活找出原因。最初,它被命名为Amount;我想也许这是一个保留的词或什么,所以我把它改为Dollars。我最初也把它作为一个实际的数字,而不是一个字符串,仍然有同样的问题(然后它总是返回0)。我想也许将它分配给变量可能是一个问题,所以我提醒实际属性本身而不是变量(警报仅用于调试),但属性直接返回0。

我也认为在检查code.Id == val时可能是类型问题,但这不是问题,因为它实际上是找到正确的项目并从中获取属性文本。

我在这里发现了几个类似的问题,但它们似乎都与属性本身是一个数组有关,用户没有索引到属性中。我的不是数组,个别属性都是直接值。

我在Firefox(57.0)和谷歌浏览器(62.0.3202.94)中尝试了这一点,甚至尝试过Opera(49.0.2725.47),我在所有三种浏览器中都得到了相同的结果。

为了真正让自己感到困惑,我决定在Firefox中逐步完成客户端调试器,看看会发生什么。查看页面源时,它的值明显为46.2: enter image description here

然而,当单步执行该函数并查看变量时,当它从数组中提取该代码时,它会将值加载到内存中: enter image description here

所以,是的...现在我对正在发生的事情感到困惑,因为它加载到内存中的值与实际来源不匹配。我搜索了代码以确保...和BAH!看截图引发了一个想法,我想出来了。为后人提供答案的详细信息。

2 个答案:

答案 0 :(得分:0)

因此,它在我的思考过程中引发了一致,并将其视为@ sandy_22的评论和来自Javascript调试器的屏幕截图的组合。

代码中保存的数组是使用文字从代码隐藏中分配的。如 var codes = <asp:literal id="ltlCodes" runat="server"/>

当更改页面上的其他一个下拉列表时,它将通过AJAX根据所选客户端重新绑定文字(不同的客户端具有不同的费用金额)。

这一切都运行正常,它会更新文字,来源得到适当的更新,当我做View Source时,我会看到更新的数组。

但它并没有导致Javascript将新数组重新加载到codes变量中。因此,即使源代码显示正确的数组数据,内存中的变量本身仍保留数据的原始副本。

我取出了字面值,因此客户端代码刚刚变为var codes = null; 然后在服务器端,当切换客户端并重新绑定代码时,我现在用Javascript片段更新它们,如下所示:
AjaxManager.ResponseScripts.Add("codes = " & linqForNewArray() & ";")
这样,内存中变量实际上会更新,现在一切正常。

答案 1 :(得分:-1)

请尝试替换var amt = code.Dollars;以下:

var amt = Number(code.Dollars);