2012-01-16 212 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()的現代瀏覽器中完成,但內部可能是通過對象屬性進行迭代,您需要使用墊片才能在舊版瀏覽器中運行。

相關問題