jQuery:对$.each的结果进行排序

3

我找到的使用$.each的唯一示例都是HTML示例,这不是我想要的。我有以下对象:

var obj = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};

我这样遍历对象:

$(array).each(function(index, value) {
    // ...
});

我希望按照obj3obj4排序。最好不使用异步方法,在输出之前(或期间)如何对结果进行排序?(我也不想两次循环遍历,因为每次可能有数百个。)


属性没有顺序:你的“数组”只是一个普通对象。要么有一个真正的数组,比如[["obj1", 39], ["obj2",6], ...],要么首先对键进行排序,然后使用排序后的键集迭代对象。 - user166390
另请参见此问题/答案 - scessor
你的“数组”只是一个对象;你是想对对象的属性进行排序,还是你真的有像这样的对象数组? - tvanfosson
然后我想按对象键内的值排序。同样的事情。 - Nahydrin
如果您不介意使用另一个jQuery插件,可以尝试这个:http://james.padolsey.com/javascript/sorting-elements-with-jquery/ - CBusBus
2个回答

10
var array = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};

尽管名称中包含"array",但它实际上不是一个数组而是一个对象。根据 obj3obj4 进行排序并没有什么意义。

现在,如果你将该对象转换为一个对象数组,就可以使用 array.sort 方法对其进行排序。

var array = [
    { obj1: 39,
      obj2: 6,
      obj3: 'text'
      obj4: 'text'
      obj5: 0
    },{ obj1: 40,
      obj2: 7,
      obj3: 'text2'
      obj4: 'text3'
      obj5: 0
    }
];

array.sort(function(a, b) {

    var textA = a.obj3.toLowerCase();
    var textB = b.obj3.toLowerCase();

    if (textA < textB) 
       return -1; 
    if (textA > textB)
       return 1;
    return 0; 
});

当然,如果要按数字属性对其进行排序,只需这样:

array.sort(function(a, b) {
    return a.obj1 - b.obj1;
});

1
现在如果我想按obj1obj2排序怎么办? - Nahydrin
1
谢谢。另外,我该如何找到所有obj3等于'hello'的对象? - Nahydrin
1
@Brian - 你可以使用for循环,然后比较每个对象的obj3是否等于"hello"。 - Adam Rackis

4

对象属性没有定义的顺序,它们不能被排序。数组是有顺序的。如果您想要按特定顺序获取键,则必须将它们放入数组中并定义顺序。

您可以从对象中获取所有属性名称(例如键),对其进行排序,然后按该顺序迭代属性。要执行此操作,您需要按以下方式进行:

var obj = {
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
};
var keys = [];
for (var prop in obj) {
    keys.push(prop);
}
keys.sort();
for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var value = obj[key];
    // do whatever you want to do with key and value
}

正如你所看到的,这需要额外的迭代来获取和排序键列表。我不知道有任何绕过这个问题的方法。在现代浏览器中可以使用 obj.keys() 来获取键,但内部可能仍然需要对对象属性进行迭代,并且您需要一个 shim 来允许它在旧版浏览器中工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接