jQuery:迭代ajax返回


jQuery: Iterate through ajax return

对jQuery非常陌生,不完全理解对象和数组之间的区别,所以如果我的术语不正确,我道歉-请纠正我!

我有一个成功的ajax返回数组从PHP:

$.ajax({
    url: "......",
    dataType: "json",
    type: "GET",
    data: {
        start_date: start,
        end_date: end
    },
    success: function (res) {
        $.each(res, function( key, value ){
            $('#FoundEvents').append('<option value="'+ key +'">'+ value +'</option>');
        });
    }
});

这给了我[object object]在每个选项标签。显而易见,我处理的是对象而不是数组?所有的数据都存在,我只是找不到正确的语法来访问它。如何从这一点开始迭代数组数据?

如果我正确理解我的控制台读数,有10个'对象',然后在每个对象中有几个'键:值'。

谢谢你的帮助!

更新

PHP数组的结构如下:$ arr =数组(1 =>数组(键=>值),2 =>阵列(键=>值)……)

我正在尝试访问值。

更新2

这是我的新代码:
 $.each(res, function(index, item){
    $.each(item, function(key, value){
        if(key == "event_title")
        {
            Events.push({"event_title":value});
        }
    });
});
$.each(Events, function(index, value){
    $('#FoundEvents').append('<option value="'+ index +'">'+ Events.value +'</option>');
});

但是我的数组中仍然有对象?我不明白为什么。我假设"价值"本身就是对象……我不介意,但我需要知道如何把数据取出来。

有很多地方可以帮助解释数组和对象之间的区别。简而言之,在JavaScript中Array是Object的类型。它继承了Object的所有属性,但有额外的属性和方法,如数字索引和推/弹出。

当您说在控制台中有10个对象时,您指的是成功处理程序中res的内容吗?听起来您可能对res中的每个元素都有一个嵌套的Object。如果不知道返回的JSON数据是如何结构化的,那么诊断问题就有点棘手了。

你能在处理程序中发布console.log(res);的输出吗?

啊,所以你确实有嵌套的对象作为响应。你可能需要像这样重构PHP数组:

$arr = array(1 => array(key=>"something", value=>"something's value"), 2 => array(key=>"something else", value=>"something else's value") ...)
然后,在你的成功处理程序的每个函数中,你可以做:
$.each(res, function( index, item ){
  var key = item.key,
      val = item.value;
  $('#FoundEvents').append('<option value="'+ key +'">'+ value +'</option>');
});

更新2

如果你真的不能改变PHP发送响应的方式,你可能需要这样做。但是,如前所述,这似乎有点小题大做,因为res数组中的对象只会有一个键/值对。

$(document).ready(function () {
    $.each(res, function(index, item) {
      $.each(item, function(key, value) {
        // do something with key and value
      });
    });
});

您正在迭代的数据可能有key字段,但是jQuery不会为您解压缩它。这就是为什么你得到[object Object]文本而不是实际值。在将数据返回到网页之前,您应该像这样转换数据:

[{'key1': 'val1'}, {'key2': 'val2'}]

{'key1': 'val1', 'key2': 'val2'}

但是如果你关心顺序(对象遍历顺序是任意的),你可以这样做:

[{key: 'key1', value: 'val1'}, {key: 'key2', value: 'val2'}]

然后像这样访问数组中的数据:

 $('#FoundEvents').append('<option value="'+ obj.key +'">'+ obj.value +'</option>');

你就快成功了。回调函数中的第二个参数是数组或对象,第一个参数是对象属性的数组索引。您必须使用index/property来获取该值。

尝试如下:

success: function (res) {
    $.each(res, function( key, value ){
        $('#FoundEvents').append('<option value="'+ key +'">'+ value[key] +'</option>');
    });
}

请注意我的更改,即选项标签内的文本。

你也可以考虑注销对象到控制台,这样你就可以检查结构,见下面:

success: function (res) {
    $.each(res, function( key, value ){
        //The output can be found in developer console which is found in any modern browser.
        console.log(value);
        $('#FoundEvents').append('<option value="'+ key +'">'+ value[key] +'</option>');
    });
}