使用 .each 遍历 Json 响应
using .each to loop through Json Response
我正在尝试使用 .each() 遍历 json 对象,但我在努力使语法正确。
Ajax 调用,结果是 "undefined":
$('.showGroup a').on('click', function(e) {
e.preventDefault();
var _href = $(this).attr("href");
$.ajax({
dataType: 'json',
url : _href,
type : 'GET',
success : function(response) {
$("#replace").empty();
display = response;
$.each(display, function(i, member) {
alert(display[i].company_name);
});
},
error : function() {
console.log('error');
}
});
});
如果我只是调用 alert(display[i]);我的 json 对象如下所示:
{"total":134,"per_page":15,"current_page":1,"last_page":9,"from":1,"to":15,"data":[{"id":"89","company_name":"test" ...
我也尝试嵌套另一个 .each() 循环,但我得到了响应:未捕获的类型错误:无法使用 'in' 运算符搜索“17381”
我查看了几个 SO 答案并尝试了各种样式的 .each 循环,但我总是遇到未定义的错误。
我错过了什么?
编辑
我正在后端构建这样的 json:
$members = $this->user->getMemberIds($loggedIn->id, $display, $associationFilter);
$this->arrResponse['members'] = $members->toJson();
return Response::json($this->arrResponse);
company_name
是嵌套的 属性.
您可以像
一样访问它
$.each(display, function(i, member) {
if (i == 'data') {
console.log(display[i][0]['company_name']);
}
});
或者如果您在 display['data']
数组本身上使用 $.each
$.each(display['data'], function(i, member) {
console.log($(this)[0]['company_name']);
});
var display = {
"total": 134,
"per_page": 15,
"current_page": 1,
"last_page": 9,
"from": 1,
"to": 15,
"data": [{
"id": "89",
"company_name": "test"
}]
};
$.each(display, function(i, member) {
if (i == 'data') {
console.log(display[i][0]['company_name']);
}
});
$.each(display['data'], function(i, member) {
console.log($(this)[0]['company_name']);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
您可以通过这种方式访问每个循环:
$.each(display, function (i, member) {
for (var i in member) {
alert("Company Name: " + member[i].company_name);
}
});
这应该可以解决您的问题
$.each(display.data,function(i,member){
console.log(member.id+":"+member.company_name);
});
您需要遍历数据对象而不是显示对象。
Fiddle Link:- Demo
我认为更好的方法是使用 vanilajs( pure javascript ) ,因为 jQuery $.each 与 vanilajs for 循环相比非常慢。因此,我提供了一个有效的示例,如果在理解解决方案时遇到任何问题,请告诉我。
这是一个示例,说明常规 javascript(因此 vanilajs 循环)执行 https://jsperf.com/jquery-each-vs-for-loop/6
的速度有多快
var i = 0,
j = 0;
var items = [{
"total": 55,
"to": 22,
"data": [{
"id": "89",
"company_name": "CompanyName 1"
}, {
"id": "89.1",
"company_name": "CompanyName 1.1"
}]
}, {
"total": 51,
"to": 22,
"data": [{
"id": "90",
"company_name": "CompanyName 2"
}, {
"id": "90.1",
"company_name": "CompanyName 2.1"
}]
}];
var isEmpty = function(variable) {
return variable === undefined || variable === null || variable === '' || variable.length === 0;
}
// jquery foreach is very slow,
// it is always recommended to use valinajs for loop(where jQuery is not necessary)
for (i = 0; i < items.length; i++) {
if (isEmpty(items[i].data) === false) {
// data exist
for (j = 0; j < items[i].data.length; j++) {
if (isEmpty(items[i].data[j].company_name) === false) {
// company exist
console.log(items[i].data[j].company_name);
}
}
}
}
这对我有用
success : function(json) {
var obj = JSON.parse(JSON.stringify(json));
display = obj;
$.each(display, function(i) {
alert(display[i].secretQuestion);
});
}
我正在尝试使用 .each() 遍历 json 对象,但我在努力使语法正确。
Ajax 调用,结果是 "undefined":
$('.showGroup a').on('click', function(e) {
e.preventDefault();
var _href = $(this).attr("href");
$.ajax({
dataType: 'json',
url : _href,
type : 'GET',
success : function(response) {
$("#replace").empty();
display = response;
$.each(display, function(i, member) {
alert(display[i].company_name);
});
},
error : function() {
console.log('error');
}
});
});
如果我只是调用 alert(display[i]);我的 json 对象如下所示:
{"total":134,"per_page":15,"current_page":1,"last_page":9,"from":1,"to":15,"data":[{"id":"89","company_name":"test" ...
我也尝试嵌套另一个 .each() 循环,但我得到了响应:未捕获的类型错误:无法使用 'in' 运算符搜索“17381”
我查看了几个 SO 答案并尝试了各种样式的 .each 循环,但我总是遇到未定义的错误。
我错过了什么?
编辑 我正在后端构建这样的 json:
$members = $this->user->getMemberIds($loggedIn->id, $display, $associationFilter);
$this->arrResponse['members'] = $members->toJson();
return Response::json($this->arrResponse);
company_name
是嵌套的 属性.
您可以像
一样访问它$.each(display, function(i, member) {
if (i == 'data') {
console.log(display[i][0]['company_name']);
}
});
或者如果您在 display['data']
数组本身上使用 $.each
$.each(display['data'], function(i, member) {
console.log($(this)[0]['company_name']);
});
var display = {
"total": 134,
"per_page": 15,
"current_page": 1,
"last_page": 9,
"from": 1,
"to": 15,
"data": [{
"id": "89",
"company_name": "test"
}]
};
$.each(display, function(i, member) {
if (i == 'data') {
console.log(display[i][0]['company_name']);
}
});
$.each(display['data'], function(i, member) {
console.log($(this)[0]['company_name']);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
您可以通过这种方式访问每个循环:
$.each(display, function (i, member) {
for (var i in member) {
alert("Company Name: " + member[i].company_name);
}
});
这应该可以解决您的问题
$.each(display.data,function(i,member){
console.log(member.id+":"+member.company_name);
});
您需要遍历数据对象而不是显示对象。
Fiddle Link:- Demo
我认为更好的方法是使用 vanilajs( pure javascript ) ,因为 jQuery $.each 与 vanilajs for 循环相比非常慢。因此,我提供了一个有效的示例,如果在理解解决方案时遇到任何问题,请告诉我。
这是一个示例,说明常规 javascript(因此 vanilajs 循环)执行 https://jsperf.com/jquery-each-vs-for-loop/6
的速度有多快var i = 0,
j = 0;
var items = [{
"total": 55,
"to": 22,
"data": [{
"id": "89",
"company_name": "CompanyName 1"
}, {
"id": "89.1",
"company_name": "CompanyName 1.1"
}]
}, {
"total": 51,
"to": 22,
"data": [{
"id": "90",
"company_name": "CompanyName 2"
}, {
"id": "90.1",
"company_name": "CompanyName 2.1"
}]
}];
var isEmpty = function(variable) {
return variable === undefined || variable === null || variable === '' || variable.length === 0;
}
// jquery foreach is very slow,
// it is always recommended to use valinajs for loop(where jQuery is not necessary)
for (i = 0; i < items.length; i++) {
if (isEmpty(items[i].data) === false) {
// data exist
for (j = 0; j < items[i].data.length; j++) {
if (isEmpty(items[i].data[j].company_name) === false) {
// company exist
console.log(items[i].data[j].company_name);
}
}
}
}
这对我有用
success : function(json) {
var obj = JSON.parse(JSON.stringify(json));
display = obj;
$.each(display, function(i) {
alert(display[i].secretQuestion);
});
}