2011-08-30 28 views
1

目的定製javascript對象排序並保持索引關聯

var obj = { 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    }, 
    uniquestring2: 
    { 
     obj1: 'content' 
    } 
} 

所以我需要由第一父元素包含的元件的編號的對象進行排序。 .sort函數的使用對我來說不是一種解決方案,因爲我需要維護索引assosiaction哪個數組不保留。

結果應該是:

var obj = { 
    uniquestring2: 
    { 
     obj1: 'content' 
    }, 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    } 
} 
+1

你不能一個對象的屬性,因爲他們不是一個有序數組排序。也許你想以某種順序遍歷這些屬性? – js1568

+0

實現了一些排序算法,如果它不適合你的情況,請不要使用jquery .sort。 http://stackoverflow.com/questions/220044/which-sort-algorithm-works-best-on-mostly-sorted-data –

回答

4

Javscript對象沒有排序順序,使他們不能進行排序。爲了排序,你必須有一個數組,並且在你的代碼中看不到數組。

對象鍵沒有定義的順序。

  • 如果您只需要有序訪問,請使用數組。
  • 如果您只需要鍵控訪問,請使用對象。
  • 如果兩者都需要訪問,則可以使用並行數組,但除非數據未更改,否則這是一種痛苦。

你能做到這一點包含這樣的排序順序鍵引用一次性創建平行排列的:

var obj = { 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    }, 
    uniquestring2: 
    { 
     obj1: 'content' 
    } 
} 

var objOrder = []; // sorted arrays that contains first level keys into obj 
var num; 
for (var i in obj) { 
    objOrder.push(i); // get all keys into the array 
    num = 0; 
    for (var j in obj[i]) { 
     ++num;   // count items in each key object 
    } 
    obj[i].keyCnt = num; // save this for later sorting purposes 
} 
// now sort the parallel array by keyCnt 
objOrder.sort(function(a, b) { 
    return(obj[a].keyCnt - obj[b].keyCnt); 
}); 

然後遍歷有序的鑰匙,你會做這樣這樣的:

for (var i = 0; i < sortedOrder.length; i++) { 
    var item = obj[sortedOrder[i]]; 
    // do something with item here 
} 
2

obj是哈希不是一個數組,所以你不能對它進行排序。例如,obj[0]; // is undefined。現在,如果你有這樣的:

var obj = { 
    uniquestring1: 
    { 
     obj1: 'content', 
     obj2: 'content' 
    }, 
    uniquestring2: 
    { 
     obj1: 'content' 
    } 
}; 
var arr = [], 

for(var i in obj) { 
    arr.push(obj[i]); 
} 

arr.sort(function (a, b) { 
    return Object.keys(a).length - Object.keys(b).length; 
}) 

那麼那樣會的工作,用Object.keys

+0

當然,我知道這就是爲什麼我在這裏問一個解決方法。 – keepwalking

+1

@keepwalking:你爲什麼要尋找解決方法?這有什麼問題?如果你需要你的標籤,你應該把你的對象包裝在另一個*對象中: {label:'uniquestring1',value:{ obj1:'content', obj2:'content' } –

+0

keepwalking,check out編輯 – Joe