Jquery getJSON操作成功后未定义data.length
我正在用getJSON中的JSON数据填充下拉列表 填充工作正常,但试图通过与Jquery getJSON操作成功后未定义data.length,jquery,json,each,Jquery,Json,Each,我正在用getJSON中的JSON数据填充下拉列表 填充工作正常,但试图通过与数据进行比较来确定填充已完成。长度不是数据。长度是未定义的,我不明白为什么 数据如下所示: { "1": { "id": "1", "name": "Plymouth" }, "2": { "id": "2", "name": "Torquay" } } $('.locationList').empty(); $('.lo
数据进行比较来确定填充已完成。长度
不是数据。长度
是未定义的
,我不明白为什么
数据如下所示:
{
"1": {
"id": "1",
"name": "Plymouth"
},
"2": {
"id": "2",
"name": "Torquay"
}
}
$('.locationList').empty();
$('.locationList').append('<option value="">Select...</option>');
$.getJSON('/Settings/locations.txt', function (data) {
var dataNum = data.length;
var counter = 1;
$.each(data, function (i, item) {
$('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
if (counter >= dataNum) {
$('#bookTo').val(locationID + 1);
$('#transferFrom').val(locationID);
};
counter++;
});
});
我的代码如下所示:
{
"1": {
"id": "1",
"name": "Plymouth"
},
"2": {
"id": "2",
"name": "Torquay"
}
}
$('.locationList').empty();
$('.locationList').append('<option value="">Select...</option>');
$.getJSON('/Settings/locations.txt', function (data) {
var dataNum = data.length;
var counter = 1;
$.each(data, function (i, item) {
$('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
if (counter >= dataNum) {
$('#bookTo').val(locationID + 1);
$('#transferFrom').val(locationID);
};
counter++;
});
});
允许我在$完成后预设下拉框的值。每个
循环都已完成(这适用于其他列表),但不会发生
当我运行警报(data.length)
时,我得到了未定义的,这毫无意义,因为数据
显然有一个长度
,以便它通过$正确填充下拉框。每个,它都有
编辑:抱歉,应该添加,变量locationID
在脚本前面从Cookie声明,并且是有效的您的JSON:
{"1":{"id":"1","name":"Plymouth"},"2":{"id":"2","name":"Torquay"}}
是一个对象,而不是数组,因此未定义length
属性。
如果要将其解析为数组,服务器需要给出如下响应:
{"response": [{"1":{"id":"1","name":"Plymouth"}},
{"2":{"id":"2","name":"Torquay"}}] }
用[]
代替{}
这是一个对象:
data = {
"1": {
"id": "1",
"name": "Plymouth"
},
"2": {
"id": "2",
"name": "Torquay"
}
}
而且它没有length
属性
请参见:仅属性1
和2
是否确实要将其作为对象评级器,然后作为数组:
data = [
{
"id": "1",
"name": "Plymouth"
},
{
"id": "2",
"name": "Torquay"
}
]
然后就有了length
属性和许多其他本机数组方法,如sort
。您可以通过以下方式访问数据:
data[0]
这等于:
{
"id": "1",
"name": "Plymouth"
}
也许这不是最好的方法,但像这样的东西可能是一个快速修复
$('.locationList').empty();
$('.locationList').append('<option value="">Select...</option>');
$.getJSON('/Settings/locations.txt', function (data) {
var dataNum = 0;
for (i in data) {if (data.hasOwnProperty(i)) {dataNum++;}}
var counter = 1;
$.each(data, function (i, item) {
$('.locationList').append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
if (counter >= dataNum) {
$('#bookTo').val(locationID + 1);
$('#transferFrom').val(locationID);
};
counter++;
});
});
$('.locationList').empty();
$('.locationList').append('Select…');
$.getJSON('/Settings/locations.txt',函数(数据){
var-dataNum=0;
对于(数据中的i){if(data.hasOwnProperty(i)){dataNum++;}
var计数器=1;
$。每个(数据、功能(i、项){
$('.locationList').append(''+data[i].name+'');
如果(计数器>=dataNum){
$('#bookTo').val(locationID+1);
$('#transferFrom').val(locationID);
};
计数器++;
});
});
当response.data=[]时,
这项工作:
if (response.data.length === 0)
这是一个长度优先的数组。数据的可能重复项是一个对象,而不是字符串或数组。对象不公开length
属性。当您有jQuery的.each()函数的索引值时,为什么需要dataNum
变量?我需要dataNum变量来确定$的时间。每个都已完成,因为不管文档中怎么说,否则,下拉框的值选择会在完全填充之前发生不正确!数组不采用json:{string:value,string:value}
这样的字符串。数组是:[value,value]
不正确,否则函数的其余部分肯定会失败?啊。。。阅读@AndreasAl answer为我指明了正确的方向,并附上了这条评论。。。某种程度上!是的,我确实这么认为。在这种情况下,它很好,因为它是一个非常简单的列表,但这不是一个好的做法。:d我已经更改了locations.txt
的源代码,现在它可以工作了,谢谢<代码>[{“id”:“1”,“标签”:“1”,“名称”:“普利茅斯”},{“id”:“2”,“标签”:“2”,“名称”:“托基”}]