如何对动态数组进行排序

时间:2013-05-29 19:15:22

标签: javascript jquery arrays date sorting

我有一个像这样创建的动态数组:

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将给出最远的日期。)

3 个答案:

答案 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);

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