按名称订购$

时间:2013-07-24 18:36:48

标签: ajax json

我想弄清楚为什么我的ajax $会改变我打印名单的方式?

我有一个像这样的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;
    });
});

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

希望得到帮助并提前感谢: - 。)

2 个答案:

答案 0 :(得分: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);
    });
});

现在您有一个已排序的数组,您也可以按可预测的顺序迭代它。

答案 1 :(得分:1)

  1. 没有“ajax $ each” - 你可能指的是jQuery函数。
  2. 在“把它们拿出来的时候”我假设你的每次通话后都有类似console.debug(名字)的内容
  3. 对象不是按照定义在javascript中排序的,因此您的变量“names”中没有其他顺序。尽管如此,今天大多数javascript实现(以及所有可能对您很重要的 - 在最常用的浏览器中使用的实现)在对象中使用稳定的顺序,这通常取决于您插入内容的顺序。
  4. 所有这一切都说明,你可能有3个理由没有得到你期望的结果:

    1. 试试console.debug(数据),看看你得到了什么 - 你想要的订单?
    2. 由于您没有明确说明如何调试您的东西,问题可能在于您输出的方式而不是数据存储。这里也试试console.debug(名字)。
    3. 你正在使用一个功能,可以解除对预期的影响,比如控制台。*。这意味着如果你将console.debug()作为一个对象,显示的值将取决于你在浏览器中展开显示的树的那一刻,而不是在调用该行的时候!