从json内容的下拉列表中获取未定义

时间:2014-01-09 12:41:12

标签: javascript jquery json

编辑2

检查小提琴 - http://jsfiddle.net/SN5zT/2/

以下是小提琴,我不知道为什么我在下拉列表中未定义。

我的小提琴 - http://jsfiddle.net/z6GDj/

var res = '{"allSportPosition":{"25":"Forwards (Strickers)","27":"Fullbacks (Defenders)","28":"Goalkeeper ","26":"Midfielders"}}';


try {
    var sportPositionOptions = '';
    var parsedJson = JSON.parse(res);
    var allSportPosition = parsedJson.allSportPosition;
    var values = new Array();
    $.each(allSportPosition, function (index, value) {
        values[index] = value;
    });
    //alert(values.length);
    values.sort();
    $.each(values, function (atIndex, atValue) {
        sportPositionOptions = sportPositionOptions + '<option value="' + atIndex + '">' + atValue + '</option>';
    });
    $(sportPositionOptions).appendTo("#player");

} catch (e) {
    alert("Parsing error:" + e);
}

$.each自动将密钥排序为res的25,26,27,28。

请解释这个的原因以及为什么我未定义?

让我知道如果我需要更多解释,我一定会这样做:)

修改

请解释自动排序的原因http://jsfiddle.net/SN5zT/

5 个答案:

答案 0 :(得分:0)

尝试

values.push(value);

而不是

values[index] = value;

<强> Fiddle Link

答案 1 :(得分:0)

$.each正在执行以下任务,这就是为什么你会得到这么多未定义的

values[25] = "Forwards (Strickers)"
values[26] = "Midfielders"
values[27] = "Fullbacks (Defenders)"
values[28] = "Goalkeeper"

$.each浏览器期间,如果密钥是整数,则会自动对密钥进​​行排序,避免这种情况的一种方法是使用非整数密钥

答案 2 :(得分:0)

由于您将对象传递给each(),因此jquery将键作为索引参数传递。在您的对象中,键的范围为25到28.使用空数组上的值[25]设置数组会将数组扩展为索引25,前25个元素未定义。使用values.push(value)会将值附加到数组的末尾。

答案 3 :(得分:0)

以下脚本正在运行,我也想出了“undefineds”的来源。

http://jsfiddle.net/z6GDj/3/

var res = '{"allSportPosition":{"25":"Forwards (Strickers)","27":"Fullbacks (Defenders)","28":"Goalkeeper ","26":"Midfielders"}}';


try{
var sportPositionOptions = '';    
var parsedJson = JSON.parse(res);
var allSportPosition = parsedJson.allSportPosition;
var values = allSportPosition;
//$.each(allSportPosition, function(index, value) {
//    values[index] = value;
//});
//alert(values.length);

$.each(values,function(atIndex, atValue){       
    sportPositionOptions = sportPositionOptions+'<option value="'+atIndex+'">'+atValue+'</option>';            
});
$(sportPositionOptions).appendTo("#player");

}
catch(e){
    alert("Parsing error:"+ e); 
    }
  

数组自动排序,因为键设置正确。   见http://www.w3schools.com/js/js_obj_array.asp。 “阵列可以容纳   单个名称下的许多值,您可以通过访问值   指索引号。“

或者:更改索引,然后更改订单。 (索引表示订单)。

未定义的值是由javascript默认创建的,请在此处查看最后一个答案(How to append something to an array?

  

“另请注意,您无需按顺序添加,实际上也可以   跳过值,如

     

myArray [myArray.length + 1000] = someValue;

     

在这种情况下,两者之间的值将具有未定义的值。“

答案 4 :(得分:0)

您需要做的是在排序之前定义选项,然后将它们附加到您的选择中:

var res = '{"allSportPosition":{"25":"Forwards (Strickers)","27":"Fullbacks (Defenders)","28":"Goalkeeper ","26":"Midfielders"}}';


try {
    var sportPositionOptions = '',
        parsedJson = JSON.parse(res),
        allSportPosition = parsedJson.allSportPosition,
        options = new Array();

    $.each(allSportPosition, function (index, value) {
        options[index] = $('<option></option>', {
            value: index,
            text: value
        });
    });

    $.each(options, function (index) {
        $('#player').append(options[index]);
    });

} catch (e) {
    alert("Parsing error:" + e);
}

jsfiddle:http://jsfiddle.net/z6GDj/11/