2013-05-29 9 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

Мой ответ подразумевает, что вы просто хотите сортировать даты в хронологическом порядке, не сказать вчера, ближе к сегодняшнему дню, чем через два дня, но завтра ближе к сегодняшнему дню, чем два дня назад. Если это не так, вам нужно настроить функцию для выполнения математики абсолютного значения на разницу между «новыми датами» и «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/

Смежные вопросы