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

Javascript 从json内容下拉列表中获取未定义,javascript,jquery,json,Javascript,Jquery,Json,编辑2 检查小提琴- 下面是小提琴,我不知道为什么我在下拉菜单中没有定义 我的小提琴- var res='{“allSportPosition”:{“25”:“前锋(斯特里克)”,“27”:“后卫”(后卫)”,“28”:“守门员”,“26”:“中场球员”}; 试一试{ 变量sportPositionOptions=''; var parsedJson=JSON.parse(res); var allSportPosition=parsedJson.allSportPosition; var值=新

编辑2

检查小提琴-

下面是小提琴,我不知道为什么我在下拉菜单中没有定义

我的小提琴-

var res='{“allSportPosition”:{“25”:“前锋(斯特里克)”,“27”:“后卫”(后卫)”,“28”:“守门员”,“26”:“中场球员”};
试一试{
变量sportPositionOptions='';
var parsedJson=JSON.parse(res);
var allSportPosition=parsedJson.allSportPosition;
var值=新数组();
$.each(所有运动位置、功能(索引、值){
数值[指数]=数值;
});
//警报(值。长度);
value.sort();
$.each(值、函数(atIndex、atValue){
sportPositionOptions=sportPositionOptions+''+atValue+'';
});
$(sportPositionOptions)。附加到(“#播放器”);
}捕获(e){
警报(“解析错误:+e”);
}
$。对于
res
,每个
都会自动将键排序到25,26,27,28

请解释这一点的原因,以及为什么我变得不明确

如果我需要进一步解释,请告诉我,我一定会这样做:)

编辑

请解释自动排序的原因

请尝试

values.push(value);
而不是

values[index] = value;

$。每个
都在做以下作业,这就是为什么会有这么多未定义的作业

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

$期间。如果键是整数,则每个
浏览器将自动对键进行排序,避免这种情况的一种方法是使用非整数键

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

下面的脚本正在运行,我还找到了“未定义”的来源

var res='{“allSportPosition”:{“25”:“前锋(斯特里克)”,“27”:“后卫”(后卫)”,“28”:“守门员”,“26”:“中场球员”};
试一试{
变量sportPositionOptions='';
var parsedJson=JSON.parse(res);
var allSportPosition=parsedJson.allSportPosition;
var值=所有运动位置;
//$.each(所有运动位置、功能(索引、值){
//数值[指数]=数值;
//});
//警报(值。长度);
$.each(值,函数(atIndex,atValue){
sportPositionOptions=sportPositionOptions+''+atValue+'';
});
$(sportPositionOptions)。附加到(“#播放器”);
}
捕获(e){
警报(“解析错误:+e”);
}
数组自动排序,因为键设置正确。 看见“一个数组可以容纳 一个名称下有许多值,您可以通过 指的是索引编号。”

或者:改变索引,你就改变了顺序。(索引表示顺序)

默认情况下,未定义的值是由javascript创建的,请检查此处的最后一个答案()

“还要注意的是,您不必按顺序添加,实际上您可以 跳过值,如中所示

myArray[myArray.length+1000]=someValue

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


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

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);
}
var res='{“allSportPosition”:{“25”:“前锋(斯特里克)”,“27”:“后卫”(后卫)”,“28”:“守门员”,“26”:“中场球员”};
试一试{
变量sportPositionOptions=“”,
parsedJson=JSON.parse(res),
allSportPosition=parsedJson.allSportPosition,
选项=新数组();
$.each(所有运动位置、功能(索引、值){
选项[索引]=$(''{
值:索引,
文本:值
});
});
$。每个(选项、功能(索引){
$('#player')。追加(选项[索引]);
});
}捕获(e){
警报(“解析错误:+e”);
}

jsFIDLE:

对象中没有顺序的概念,它们是按浏览器选择的方式排序的。@adeneo请解释这种行为,因为你可以看到它正在变得越来越复杂sorted@Trialcoder检查我的答案。然而,我们仍在努力寻找代码不起作用的原因。我们在同一页上,小提琴使它更加清晰。您希望在下拉列表中获得JSON字符串中的顺序,但是JSON字符串被解析为带有对象的对象,而对象中没有顺序,因此您根本不能期望任何顺序。这就是应该如何完成的->他丢失了索引,哪一个可能很重要?我需要保留索引请也检查一下这把小提琴@budhram我接受你的小提琴,因为我在没有索引的情况下工作:)仍然丢失索引值。:)我查过了。在这里,您需要先在数组中创建选项,然后再对它们进行排序,然后将它们附加到您的选择中。例如,检查我的答案。
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); 
    }
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);
}