使用.each循环遍历Json Response

时间:2015-05-24 04:04:40

标签: jquery json each

我正在尝试使用.each()遍历json对象,但我正在努力使语法正确。

Ajax Call,导致“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');
    }
  });
});

如果我只是呼叫警报(显示[i]);我的json对象看起来像这样:

{"total":134,"per_page":15,"current_page":1,"last_page":9,"from":1,"to":15,"data":[{"id":"89","company_name":"test" ...

我还试图嵌套另一个.each()循环,但我得到了响应:未捕获的TypeError:无法使用'in'运算符来搜索'17381'

我已经查看了几个SO答案并尝试了各种样式的.each循环,但我总是得到一个未定义的错误。

我错过了什么?

修改 我在后端构建json:

$members = $this->user->getMemberIds($loggedIn->id, $display, $associationFilter);
           $this->arrResponse['members'] = $members->toJson();
return Response::json($this->arrResponse);

5 个答案:

答案 0 :(得分:5)

您可以通过这种方式访问​​每个循环:

$.each(display, function (i, member) {
for (var i in member) {
    alert("Company Name: " + member[i].company_name);
 }
});

DEMO

答案 1 :(得分:5)

我认为更好的方法是使用vanilajs(纯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);
      }
    }
  }
}
&#13;
&#13;
&#13;

答案 2 :(得分:2)

ls -a是一个嵌套属性。

您可以像

一样访问它
company_name

或者如果您在$.each(display, function(i, member) { if (i == 'data') { console.log(display[i][0]['company_name']); } }); 数组本身上使用$.each

display['data']

&#13;
&#13;
$.each(display['data'], function(i, member) {
    console.log($(this)[0]['company_name']);
});
&#13;
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']);
});
&#13;
&#13;
&#13;

答案 3 :(得分:2)

这应该是你的伎俩

$.each(display.data,function(i,member){
    console.log(member.id+":"+member.company_name);
});

您需要迭代数据对象而不是显示对象。

小提琴链接: - Demo

答案 4 :(得分:-1)

这对我有用

public static JObject NormalizeKeys(JObject originalObject)
{
    var newObject = new JObject();
    foreach (var kvp in originalObject)
        newObject.Add(kvp.Key.ToUpper(), kvp.Value);
    return newObject;
}