2013-05-29 46 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/