JS对象排序日期排序

JS object sorting date sorting

本文关键字:排序 日期 对象 JS      更新时间:2023-09-26

我有如下定义的JS对象-

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

在我的应用程序中的某个时刻,我从chrome.storage获得了这些(Items)的列表,我希望能够根据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);

它似乎不起作用。第一和第二CCD_ 3是相同的。我已经尝试将return a > b ? -1 : a < b ? 1 : 0;更改为return a < b ? -1 : a > b ? 1 : 0;,只是想看看是否对sortable进行了任何更改,但什么都没发生。。。谢谢~

两个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

演示: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]

演示:http://jsfiddle.net/Rfwph/2/

编辑:最好使用.slice(0),而不是.slice(),这在FF上是受支持的,但ecma262规范说只有end参数是可选的。

@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"