1

当我使用 for 循环和 json 对象填充下拉列表时,它会在最后的下拉列表中添加未定义的选项。

 for (var i in PriceRanges[purpose]) {
        var r = PriceRanges[purpose][i];
        html += '<option value="' + r.id + '">' + r.text + '</option>';
}

PriceRanges 是我的 json 对象。感谢您提前提供任何帮助。

4

4 回答 4

0

只需检查像这样的未定义,然后添加

for (var i in PriceRanges[purpose])
 {
         var r = PriceRanges[purpose][i];
         if (typeof r != "undefined") 
         {
            if (typeof r.id != "undefined"
                  && typeof r.text != "undefined")
            html += '<option value="' + r.id + '">' + r.text + '</option>';
         }
 }
于 2012-09-21T07:40:35.093 回答
0

那是因为你还没有定义var html ,它将等于 undefined .. 所以当你将它附加到字符串时, undefined 仍然在连接的字符串中 ..

所以试试这个

var html = '';
for (var i in PriceRanges[purpose]) {
        var r = PriceRanges[purpose][i];
        html += '<option value="' + r.id + '">' + r.text + '</option>';
}

这应该可以解决您的问题....

于 2012-09-21T08:06:56.413 回答
0

为了安全起见,您应该始终for in检查循环中任何密钥的财产所有者:

for (var i in PriceRanges[purpose])
{
    if (PriceRanges[purpose].hasOwnProperty(i))
    {
        html += '<option value="' + PriceRanges[purpose][i].id + '">'
                + PriceRanges[purpose][i].text + '</option>';
    }
}

但这在我看来确实像您正在迭代一个数组,在这种情况下: use for, not for in,因为数组的最后i一个for in将是 length 属性......

for (var i=0;i<PriceRanges[purpose].length;i++)
{
    html += '<option value="' + PriceRanges[purpose][i].id + '">'
            + PriceRanges[purpose][i].text + '</option>';
}

当然,为了更加安全,你应该在两个循环中添加一个 if :

if (PriceRanges[purpose][i].id && PriceRanges[purpose][i].text)

避免使用不存在的属性(因此将返回未定义)

于 2012-09-21T08:22:28.057 回答
0

我认为使用 jQuery 的 each 函数可以控制集合

var html = "";

$.each(PriceRanges.sale, function() {

        html += '<option value="' + this.id + '">' + this.text + '</option>';
});
于 2012-09-21T10:20:40.370 回答