2014-01-20 87 views
0

我有一個對象,看起來像這樣通過排序值創建排列鍵的

myList: { 
id1:{ 
     ts:'2010-01-12T00:51:00', 
     name:"roger" 
    }, 
id2:{ 
     ts:'2011-01-12T05:22:00', 
     name: "Tom" 
    }, 
id3:{ 
     ts:'2013-01-12T11:32:00', 
     name:"Jack" 
    } 
} 

我知道的對象不能排序,所以我想知道我可以生成只是按鍵陣列,其排序根據關鍵字「ts」。我想要降序排列。

因此,對於上述目的的陣列將是[ID3,ID2,ID1]

一旦我有此陣列我可以使這樣的,其中ARR進行排序陣列操作和myList中是對象

for(var i=0:i<arr.length;i++) 
{ 
alert(myList[arr[i]].name); 
} 
+0

日期的字符串比較? – thefourtheye

+0

正如所寫,上述ts值是1997年,1998年和2000年,但似乎有疑問,這是什麼意圖。 – Semicolon

+0

我是新來的js,所以如果你有一個soln我可以產生這樣一個數組,我將不勝感激 – vijar

回答

1
var keys = Object.keys(myList).sort(function(a, b) { 
    if (myList[a].ts == myList[b].ts) { 
     return 0; 
    } 
    return myList[a].ts < myList[b].ts ? 1 : -1; 
}); 

console.log(keys); 

的jsfiddle:http://jsfiddle.net/pWq2L/

說明:

  1. 首先您從對象中導出密鑰:Object.keys(myList)
  2. 您可以使用自定義比較函數進行排序,並且您可以參考比較值的.ts屬性。 ab是比較的元素的鍵

參考文獻:

0

鑑於這種數據結構,並且假定有一個很好的理由爲它不能是數組:

var myList = { 
    id1: { 
    ts: new Date('2010-01-12T00:51:00'), 
    name: 'Roger' 
    }, 
    id2: { 
    ts: new Date('2011-01-12T05:22:00'), 
    name: 'Tom' 
    }, 
    id3:{ 
    ts: new Date('2013-01-12T11:32:00'), 
    name: 'Jack' 
    } 
} 

我們可以創造和吸收Ť陣列像這樣:

var arr = []; 
Object.keys(myList).forEach(function(item) { 
    arr.push(myList[item]); 
}); 
arr.sort(function(a, b) { 
    return a.ts > b.ts ? -1 : a.ts < b.ts ? 1 : 0; 
}) 
0

一種方式來擴展zerkms溶液是與智能性能增強的對象一起工作。多功能reduce派上用場:

var result = keys.reduce(function(arr, k, i) { 
    var item = { 
     key: k, 
     index: i, 
     value: myList[k] 
    }; 
    arr.push(item); 
    return arr; 
}, []); 


//result: 
[ 
    { index:0 , key: id3, value: {...} }, 
    { index:1 , key: id2, value: {...} }, 
    { index:2 , key: id1, value: {...} } 
] 

reduce是ECMAScript的第5版的一部分;所以你可以使用polyfill填充一些空白。

http://jsfiddle.net/pWq2L/3/