0

我试图弄清楚为什么我的 ajax $each 会改变我的姓名列表的打印方式?

我有一个这样的json字符串:

[{"name":"Adam","len":1,"cid":2},{"name":"Bo","len":1,"cid":1},{"name":"Bob","len":1,"cid":3},{"name":"Chris","len":1,"cid":7},{"name":"James","len":1,"cid":5},{"name":"Michael","len":1,"cid":6},{"name":"Nick","len":1,"cid":4},{"name":"OJ","len":1,"cid":8}]

这里所有的名字都是按字母顺序排列的,但是当把它们拿出来时,它们是按“cid”排序的吗?为什么,我该如何改变?

这是我的 jQuery:

var names = {};
$.getJSON('http://mypage.com/json/names.php', function(data){ 

    $.each(data.courses, function (k, vali) {
        names[vali.cid] = vali.name;
    });
});

我猜是因为“names[vali.cid]”,但我需要那部分保持这种状态。还能做吗?

希望提前帮助和感谢:-.)

4

2 回答 2

1

迭代对象时,对象内部的排序并没有真正定义或可预测。我建议根据内部属性对数组进行排序:

var names = [];
$.getJSON('http://mypage.com/json/names.php', function(data){ 
    $.each(data.courses, function (k, vali) {
        names.push({name: vali.name, cid: vali.cid});
    });

    names.sort(function(a, b) {
        return a.name.localeCompare(b.name);
    });
});

现在您有一个有序的数组,您也可以以可预测的顺序对其进行迭代。

于 2013-07-24T18:41:28.897 回答
1
  1. 没有“ajax $each”——你可能指的是 jQuery 函数。
  2. “当让他们出去时”我认为你的意思是你的 $each 调用之后的 console.debug(names)
  3. 每个定义中的对象都没有在 javascript 中排序,因此变量“名称”中没有更多的顺序。尽管如此,今天的大多数 javascript 实现(以及所有可能对您很重要的实现 - 在最常用的浏览器中使用的那些)在对象中采用稳定的顺序,这通常取决于您插入内容的顺序。

综上所述,可能有 3 个原因你没有得到你所期望的:

  1. 试试 console.debug(data) 看看你得到了什么——你想要的顺序?
  2. 由于您没有明确说明如何调试您的东西,问题可能出在您的输出方式上,而不是数据的存储方式上。这里也可以试试 console.debug(names)。
  3. 您正在使用一个对预期取消引用的函数,例如 console.*。这意味着如果您 console.debug() 一个对象,显示的值将取决于您在浏览器中展开显示的树的那一刻,而不是调用该行的时间!
于 2013-07-24T18:43:25.020 回答