我有一个像这样创建的动态数组:
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 :(得分: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/
答案 1 :(得分: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? */
}
});
答案 2 :(得分: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);