【问题标题】:sorting items while pushing to an array在推送到数组时对项目进行排序
【发布时间】:2021-01-23 12:12:23
【问题描述】:

我想在将项目推送到数组时对日期和时间进行排序。到目前为止,我只能对日期进行排序,但不能对时间进行排序。如果同一个日期有两次,那么我如何先排序日期,然后是该日期的时间。

let items = [
{'id': 'id7', 'date': '2020-08-17', 'time': '05:02:54.000'},
{'id': 'id2', 'date': '2020-05-12', 'time': '02:09:57.000'}, 
{'id': 'id3', 'date': '2020-05-12', 'time': '03:04:44.000'}, //both the 2020-05-12 date has two timings so I want to sort these time too along with the date
{'id': 'id4', 'date': '2020-09-23', 'time': '07:16:23.000'}
];

const headers = [
'ID',
'Date',
'Time'
];

dataArr = []

items.forEach(item => {
    dataArr.push([
        item.id,
        item.date,
        item.time
    ]);
})
;
let sortedData = [headers, ...dataArr.sort((a, b) => a[1].localeCompare(b[1]))];

最终排序的数组必须看起来像


['id': 'id2', 'date': '2020-05-12', 'time': '02:09:57.000'], 
['id': 'id3', 'date': '2020-05-12', 'time': '03:04:44.000'],
['id': 'id7', 'date': '2020-08-17', 'time': '05:02:54.000'],
['id': 'id4', 'date': '2020-09-23', 'time': '07:16:23.000']

【问题讨论】:

  • a[1] 没有意义;您的数组包含对象。
  • 我推入dataArr数组,然后比较@Pointy
  • 对,但是传递给排序比较器的ab 将引用您推入数组的对象。您需要将a.dateb.datea.timeb.time 进行比较。
  • date + time制作时间戳,然后比较
  • @Pointy 它对我有用。

标签: javascript arrays string date sorting


【解决方案1】:

尝试在一个排序函数中同时对日期和时间进行排序

let ss = [
{'id': 'id7', 'date': '2020-08-17', 'time': '05:02:54.000'},
{'id': 'id2', 'date': '2020-05-12', 'time': '02:09:57.000'}, 
{'id': 'id3', 'date': '2020-05-12', 'time': '03:04:44.000'}, 
{'id': 'id4', 'date': '2020-09-23', 'time': '07:16:23.000'}
];

let dd = ss.sort((a,b)=>new Date(a.date+':'+a.time) - new Date(b.date+':'+b.time))

console.log(dd)

【讨论】:

  • 出于某种原因,在我的代码中,它按时间降序显示,尽管日期看起来不错。我试过了let sortedData = [headers, ...dataArr.sort((a,b)=>new Date(a[1]+':'+a[2]) - new Date(b[1]+':'+b[2]))];
【解决方案2】:
let sortedData = [headers, ...dataArr.sort((a, b) => a[1].localeCompare(b[1])==0 ? a[2].localeCompare(b[2]) : a[1].localeCompare(b[1]))];

let items = [
{'id': 'id7', 'date': '2020-08-17', 'time': '05:02:54.000'}, 
{'id': 'id3', 'date': '2020-05-12', 'time': '03:04:44.000'},
{'id': 'id4', 'date': '2020-09-23', 'time': '07:16:23.000'},
{'id': 'id2', 'date': '2020-05-12', 'time': '02:09:57.000'}
];

const headers = [
'ID',
'Date',
'Time'
];

dataArr = []

items.forEach(item => {
    dataArr.push([
        item.id,
        item.date,
        item.time
    ]);
})
;
let sortedData = [headers, ...dataArr.sort((a, b) => a[1].localeCompare(b[1])==0 ? a[2].localeCompare(b[2]) : a[1].localeCompare(b[1]))];
console.log(sortedData)

【讨论】:

  • 这也不起作用。日期已排序,但时间未排序
【解决方案3】:

你可以试试这样的:

function compare (a,b) {
    if(a<b) return -1;
    else if(a>b) return 1;
    else return 0;
}

items.sort((a,b) => {
    let d = compare(a.date, b.date);
    if(d < 0) return -1;
    else if(d > 0) return 1;
    else {
         //Same date compare time
        let t = compare(a.time, b.time);
        if(t < 0) return -1;
        else if(t > 0) return 1;
        else return 0;


    }

});



这首先比较日期。如果日期不同,则无需比较时间。如果日期相同,您可以比较时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2020-09-03
    • 2020-04-14
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多