2012-01-16 205 views
1

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

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

我圈像这样:

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

我想obj3obj4进行排序。最好不要使用异步方法,如何在输出之前(或期间)排序结果? (我也不会通过这个要循环两次,因为有可能是几百个在任何给定的时间。

+0

属性没有排序:你的“数组”只是一个普通的对象。要么有一个真正的数组,比如'[[“obj1”,39],[“obj2”,6],...]或者先对键进行排序,然后用* sorted * collectin键。 – 2012-01-16 21:31:47

+0

另请参阅此[问题/答案](http://stackoverflow.com/a/1359808/843985)。 – scessor 2012-01-16 21:33:25

+0

你的“数组”只是一个对象;你想排序对象的属性还是你真的有这样的对象数组? – tvanfosson 2012-01-16 21:34:32

回答

9
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; 
}); 
+1

现在如果我想按'obj1'和'obj2'排序呢? – 2012-01-16 21:41:53

+0

@BrianGraham - 我添加了一个编辑到我的答案。 – 2012-01-16 21:43:30

+1

谢谢。另外,我怎么能找到'obj3'等于'hello'的所有对象? – 2012-01-16 21:47:20

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()的现代浏览器中完成,但内部可能是通过对象属性进行迭代,您需要使用垫片才能在旧版浏览器中运行。

相关问题