2013-05-29 44 views
4

我有這樣創造了一個動態數組:如何排序動態數組

window.IDarray = []; 

而且我有這樣創造了一個詞典:

window.itemdictionary = {}; 

window.IDarray的長度是一樣的window.itemdictionary 。 而window.IDarray的值是唯一的。 window.IDarray的值也是window.itemdictionary的關鍵。

window.itemdictionary中任何鍵的「值」的數據類型也是一個字典,其中包含一個名爲"modified"的鍵,值爲格式示例"Mon May 28 11:20:46 EDT 2012"的字符串日期。

什麼是的window.IDarray值進行排序的最好方式,所以從指數0去的window.IDarray年底,window.itemdictionary其對應的日期是從當前日期越來越遠? (即,索引0將給出當前日期的最近日期,並且索引n將給出最遠的日期)。

+0

我的回答假設你只是想按時間順序對日期進行排序,不說昨天比今天兩天更接近今天,但明天比兩天前更接近今天。如果這是錯誤的,則需要調整函數以對'new Date()'和'date_a'和'date_b'之間的差異進行絕對值數學運算,然後比較比較函數結果的差異。 – jxpx777

+0

請給出樣本數據以獲得適當的解決方案 – Diode

回答

3

您將需要使用自定義排序功能,看Array.sort from MDN

首先,爲了按日期排序,需要將"modified": "Mon May 28 11:20:46 EDT 2012"轉換爲可用於比較的格式,使用Date.parse()

var tempItemDictionary = []; // use temp array to hold the timestamp 
// convert dates first 
for (var i = 0, item = null; i < IDarray.length; i++) { 
    item = itemDictionary[IDarray[i]]; 
    tempItemDictionary[IDarray[i]] = { 
     timestamp: Date.parse(item.modified) // convert date to timestamp 
    }; 
} 

然後我們運行IDarray通過.sort()使用自定義排序功能:

IDarray.sort(function(a, b) { 
    return tempItemDictionary[b].timestamp - tempItemDictionary[a].timestamp; 
}); 

見工作示例:http://jsfiddle.net/788bs/1/

+0

最好是在自定義排序函數中進行轉換,以避免修改原始數據 – Diode

+0

@tracevipin是的,可以使用另一個數組來保存時間戳並對其進行排序。 mestamp數據將在稍後再次使用。 – sweetamylase

+0

同意。如果時間戳會再次需要,最好保存它。取決於要求。 – Diode

1

排序與像一個自定義比較函數參數數組:

IDarray.sort(function(a, b) { 
    var date_a, date_b; 
    try { 
     date_a = Date.parse(itemdictionary[a]['modified']; 
     date_b = Date.parse(itemdictionary[b]['modified']; 
     return date_a - date_b; 
    } catch (e) { 
     /* Some smart exception handling for malformed strings? */ 
    } 
}); 
+0

每次進行比較時,可能不是一個好主意來調用Date.parse,對於大型集合,您將進行n^2個日期轉換:(沿着相同的性能表現,你不想在你的比較函數中使用'try catch',因爲每次進入'try'模塊時,作用域鏈都會增加,這樣它可以在* catch *發生了,可能會更好地使用'if'條件 – sweetamylase

+0

對'try ... catch'表示同意,但是'Date.parse'沒有辦法解決這個問題,因爲這就是我需要的類型,我同意它會很慢,無論... – jxpx777

0
window.IDarray = []; 
window.itemdictionary = { 
    "key0": { modified: "Mon May 28 11:20:46 EDT 2012" }, 
    "key1": { modified: "Mon May 28 11:20:46 EDT 2012" }, 
    "key2": { modified: "Mon Sep 20 20:35:15 EDT 2010" }, 
    "key3": { modified: "Mon May 10 10:07:16 EDT 2010" }, 
    "key4": { modified: "Tue May 10 10:07:16 EDT 2011" } 
}; 

var sortByDate = function(key1, key2) { 
    var date1 = new Date(window.itemdictionary[key1].modified.toString()); 
    var date2 = new Date(window.itemdictionary[key2].modified.toString()); 
    return date2 - date1; 
}; 
// lt IE9 
if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function(elt /*, from*/) { 
     var len = this.length >>> 0; 
     var from = Number(arguments[1]) || 0; 
     from = (from < 0) ? Math.ceil(from) : Math.floor(from); 
     if (from < 0) 
      from += len; 

     for (; from < len; from++) { 
      if (from in this && this[from] === elt) 
      return from; 
     } 
     return -1; 
    }; 
} 

window.itemdictionary.currDate = { modified: new Date().toString() }; 
window.IDarray = Object.keys(window.itemdictionary); 
console.log('before', window.IDarray); 
window.IDarray.sort(sortByDate); 

delete window.itemdictionary.currDate; 
window.IDarray.splice(window.IDarray.indexOf('currDate'), 1); 
console.log('after', window.IDarray); 

http://jsfiddle.net/nYWmZ/1/