2012-04-15 86 views
0

進出口試圖通過「姓名」項從對象/陣列中的項目進行排序,排序陣列通過從子陣列項值

我用參考此頁Sort array of objects和構建的一段代碼如下:

var alphabet = { 
    a: 1, 
    b: 2, 
    c: 3, 
    d: 4, 
    e: 5, 
    f: 6, 
    g: 7, 
    h: 8, 
    i: 9, 
    j: 10, 
    k: 11, 
    l: 12, 
    m: 13, 
    n: 14, 
    o: 15, 
    p: 16, 
    q: 17, 
    r: 18, 
    s: 19, 
    t: 20, 
    u: 21, 
    v: 22, 
    w: 23, 
    x: 24, 
    y: 25, 
    z: 26 
} 

var test = { 
    item: { 
     name: "Name here", 
     email: "[email protected]" 
    }, 

    item2: { 
     name: "Another name", 
     email: "[email protected]" 
    }, 

    item3: { 
     name: "B name", 
     email: "[email protected]" 
    }, 

    item4: { 
     name: "Z name", 
     email: "[email protected]" 
    } 
}; 
test.sort(function (a, b) {return alphabet[a.name.charAt(0)] - alphabet[b.name.charAt(0)]}); 

console.log(test); 

不幸的是沒有錯誤返回,並且console.log也沒有返回任何東西。 任何幫助,非常感謝!

編輯:答案已經給出 後,它似乎變量「試驗」需要是,然而,在外部庫動態地產生的可變的陣列,爲此我發這個小片的代碼。 如果任何人有同樣的問題,請隨時使用它。

var temp = []; 
$.each(test, function(index, value){ 
    temp.push(this); 
}); 

//temp is the resulting array 
+2

沒有「排序」方法的對象 - 只有數組!如果你想對對象進行排序,最好的辦法就是將測試中的鍵映射到一個Array並從那裏調用'sort'。 – rjz 2012-04-15 23:34:28

+0

您只按第一個字母排序。具有相同首字母的多個名稱將按半隨機排序。那是你要的嗎? – 2012-04-15 23:50:07

回答

4

test是一個對象,而不是一個數組。也許你想這樣的:

var test = [ 
    { 
     name: "Name here", 
     email: "[email protected]" 
    }, 
    ⋮ 
]; 

如果您需要itemitem1,...要保留針對每一個對象,你可以將其添加爲每個對象的字段:

var test = [ 
    { 
     id: "item", 
     name: "Name here", 
     email: "[email protected]" 
    }, 
    ⋮ 
]; 

要按字母順序排序,你需要不區分大小寫的比較器(和忘記alphabet對象):

compareAlpha = function(a, b) { 
    a = a.name.toUpperCase(); b = b.name.toUpperCase(); 
    return a < b ? -1 : a > b ? 1 : 0; 
}; 
+1

+1僅適用於垂直省略號。這很酷。 – jpsimons 2012-04-15 23:41:30

+0

不是compareAlpha函數與當前標記的答案几乎相同嗎? – xorinzor 2012-04-15 23:52:14

+0

@xorinzor:不,它比較整個字符串(不只是第一個字符),也不依賴於「字母」對象。 – 2012-04-15 23:53:07

1

首先,測試應的陣列,而不是一個對象。其次,我認爲你在選擇字符後錯過了對.toLowerCase()的調用。

test.sort(function (a, b) { 
    return alphabet[a.name.charAt(0).toLowerCase()] - alphabet[b.name.charAt(0).toLowerCase()]; 
}); 
+0

嗯,是的,我確實忘了.toLowerCase()函數,它現在正在工作中完美! – xorinzor 2012-04-15 23:43:34