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

Posted

技术标签:

【中文标题】jQuery:对 $.each 的结果进行排序【英文标题】:jQuery: Sort results of $.each 【发布时间】:2012-02-11 18:38:47 【问题描述】:

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

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

我像这样遍历对象:

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

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

【问题讨论】:

属性没有排序:你的“数组”只是一个普通的对象。要么有一个真正的数组,比如[["obj1", 39], ["obj2",6], ...],要么对键进行排序first,然后使用sorted键集合迭代对象。 另见question/answer。 你的“数组”只是一个对象;您是在尝试对对象的属性进行排序,还是真的有这样的对象数组? 然后我想按对象键中的值排序。同样的事情。 如果你不介意使用另一个 jQuery 插件。 james.padolsey.com/javascript/sorting-elements-with-jquery 【参考方案1】:
var array = 
    obj1: 39,
    obj2: 6,
    obj3: 'text'
    obj4: 'text'
    obj5: 0
;

不是一个数组(尽管它的名字)。它是一个对象。按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;
);

【讨论】:

现在如果我想按obj1obj2 排序怎么办? 谢谢。另外,我怎样才能找到所有 obj3 等于 'hello' 的对象? @Brian - 您将使用 for 循环,并将每个对象的 obj3 与“hello”进行比较【参考方案2】:

对象属性没有定义的顺序。它们无法排序。数组确实有顺序。如果您希望键按特定顺序排列,则必须将它们放在一个数组中并定义顺序。

您可以从对象中获取所有属性名称(例如键),对它们进行排序,然后根据需要按该顺序迭代属性。为此,您可以这样做:

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 才能使其在旧浏览器中工作。

【讨论】:

以上是关于jQuery:对 $.each 的结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

jquery json遍历节点的问题

jquery foreach和each的区别

JQ——遍历(each遍历数组遍历)添加(appendappendTo)

jQuery DOM 操作 each();

XSLT 1.0 / 使用条件对每个结果进行排序

如何按日期对 $.each() 函数进行排序