2013-09-03 2 views
1

Я объект JS определяется следующим образом -объект JS сортировки Дата сортировки

var item = {}; 
item[guid()] = 
{ 
    symbol: $('#qteSymb').text(), 
    note: $('#newnote').val(), 
    date: $.datepicker.formatDate('mm/dd/yy', dt) + " " + dt.getHours() + ":" + minutes, 
    pagename: getPageName() 
}; 

В какой-то момент в моем приложении я получаю список тех (Items) назад от chrome.storage, и я хотел бы быть возможность сортировать его на основе date

Вот что я делаю

var sortable = []; 

      $.each(Items, function (key, value) { 
       if (value.symbol == $('#qteSymb').text() || all) {       
        sortable.push([key, value]); 
       } 
      }); 

      console.log(sortable); 

      sortable.sort(function (a, b) { 
       a = new Date(a[1].date); 
       b = new Date(b[1].date); 
       return a > b ? -1 : a < b ? 1 : 0; 
      }); 

      console.log(sortable); 

это не похоже на работу. Первый и второй console.log(sortable); - это то же самое. Я попытался изменить return a > b ? -1 : a < b ? 1 : 0; к return a < b ? -1 : a > b ? 1 : 0; только чтобы увидеть, если я получаю какие-либо изменения в sortable, но ничего не происходит ... Спасибо ~

+3

Я хотел бы предложить только хранящий временную метку 'dt.getTime()', а также и просто сортировать по ней нравится: 'возвращать [2] - б [2]; ' – kirilloid

+0

Вы проверили, что на самом деле вы получаете объекты targetDate из' new Date (a [1] .date) '? -> используйте 'console.log (a.toString() + 'и' + b.toString())' в функции. – cars10m

ответ

1

Оба console.log показывают один и тот же массив, потому что, когда вы используете console.log(sortable), sortable передается по ссылке, и консольный вывод происходит ПОСЛЕ завершения вашего скрипта - когда sortable уже отсортирован.

Создание кода простой:

var arr = [3,2,1]; 
console.log(arr); // Produces `[1,2,3]` because its printed 
        // to the console after `arr.sort();` 
arr.sort(); 
console.log(arr); // Produces `[1,2,3]`, as expected 

Demo: http://jsfiddle.net/Rfwph/


Обход

Если вы хотите быть в состоянии сделать console.log с массивом, чтобы увидеть его перед изменением вы можете использовать .slice(0) - копия массив, то есть для получения другого массива, который содержит те же элементы, что и ваш массив.

var arr = [3,2,1]; 
console.log(arr.slice(0)); // [3,2,1] 
arr.sort(); 
console.log(arr); // [1,2,3] 

Demo: http://jsfiddle.net/Rfwph/2/

Edit: лучше использовать .slice(0) вместо .slice(), который поддерживается на FF, но ecma262 спецификации говорит только end аргумент является необязательным.

+0

Хорошо, это имеет смысл, спасибо Ориол. Это значит, что console.log не является надежным инструментом отладки? Как бы вы подтвердили этот вид? Я помещал точки останова в 'console.log (sortable)' пятна, но массив все тот же. – americanslon

+0

@americanslon Если вы хотите отлаживать массивы, лучше их скопировать *, используя '.slice()' – Oriol

0

@Oriol:

Я просто сделал идентичную скрипку http://jsfiddle.net/JaU4g/, но для меня это работает!

var ar=[3,1,8,4,7,2,4,1] 
console.log(ar.join(',')); 
ar.sort(); 
console.log(ar.join(',')); 

дает:

[18:55:31.616] "3,1,8,4,7,2,4,1" 
[18:55:31.616] "1,1,2,3,4,4,7,8" 
+0

Это потому, что вы используете 'ar.join (',')', поэтому вы конвертируете 'ar' в строку.Затем, когда вы изменяете 'ar', строка не изменяется. – Oriol

+0

Это не так. '.join()' просто возвращает строку, полученную из объекта массива, и оставляет фактический массив неизменным. В противном случае я не смог бы снова присоединиться к нему снова ... – cars10m

+0

Да, я имел в виду это, но я не очень хорошо объяснил. Но я хотел указать, что вы называете 'console.log' строкой вместо объекта' ar'. Затем, если вы измените 'ar', строка не изменится. – Oriol

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