firestore时间戳上对象javascript/typescript的排序数组
我有下面的数组结构firestore时间戳上对象javascript/typescript的排序数组,javascript,angular,typescript,sorting,google-cloud-firestore,Javascript,Angular,Typescript,Sorting,Google Cloud Firestore,我有下面的数组结构 [ { "id": "8gFUT6neK2I91HIVkFfy", "element": { "id": "8gFUT6neK2I91HIVkFfy", "archived": false, "updatedOn": { "seconds": 1538653447, "nanoseconds": 836000000 } }, "groupBy": "pr"
[
{
"id": "8gFUT6neK2I91HIVkFfy",
"element": {
"id": "8gFUT6neK2I91HIVkFfy",
"archived": false,
"updatedOn": {
"seconds": 1538653447,
"nanoseconds": 836000000
}
},
"groupBy": "pr"
},
{
"id": "9jHfOD8ZIAOX4fE1KUQc",
"element": {
"id": "9jHfOD8ZIAOX4fE1KUQc",
"archiveDate": {
"seconds": 1539250407,
"nanoseconds": 62000000
},
"archived": false,
"updatedOn": {
"seconds": 1538655984,
"nanoseconds": 878000000
}
},
"groupBy": "pr"
},
{
"id": "CeNP27551idLysSJOd5H",
"element": {
"id": "CeNP27551idLysSJOd5H",
"archiveDate": {
"seconds": 1539248724,
"nanoseconds": 714000000
},
"archived": false,
"updatedOn": {
"seconds": 1538651075,
"nanoseconds": 235000000
}
},
"groupBy": "pr"
},
{
"id": "Epd2PVKyUeAmrzBT3ZHT",
"element": {
"id": "Epd2PVKyUeAmrzBT3ZHT",
"archiveDate": {
"seconds": 1539248726,
"nanoseconds": 226000000
},
"archived": false,
"updatedOn": {
"seconds": 1538740476,
"nanoseconds": 979000000
}
},
"groupBy": "pr"
}
]
和下面的代码进行排序
示例JSFIDLE
这不会产生任何效果。是这样的吗:
var array = [
{id: 1, name:'name1', date: 'Mar 12 2012 10:00:00 AM'},
{id: 2, name:'name2', date: 'Mar 8 2012 08:00:00 AM'}
];
console.log(array.sort((a, b) => {
return new Date(a.date) - new Date(b.date)
}))
将字符串转换为日期,然后减去它们以获得负值、正值或零值:
array.sort(function(a,b){
return new Date(b.date) - new Date(a.date);
});
我们需要解决几个问题:
updatedOn
对象不能转换为日期。你需要做额外的工作getTime
进行比较,实际上您放弃了毫秒数,该函数返回秒数function objToDate(obj) {
let result = new Date(0);
result.setSeconds(obj.seconds);
result.setMilliseconds(obj.nanoseconds/1000000);
console.log('With nano', result);
return result;
}
这将创建一个新日期,然后设置秒和毫秒。这为您提供了2018年10月我使用您的测试数据的日期
然后,要比较它们并解决剩余的问题,请使用以下(更简单的)表格:
应该这样做
要反转排序顺序,只需使用小于运算符:
return bd - ad
不要张贴文字图片。还有,我不知道你在做什么,但是你可以简单地做
(a,b)=>b.element.date-a.element.date
。排序方法不会改变数组,它会返回一个新的数组。问题可能是您忘记将结果分配给此.arraydata?(它确实发生了变异,这是错误的)我尝试了很多变化,比如简单地a.element.date、new date(a.element.data)然后尝试Number(new date(a.element.date),但是没有任何效果。你可以用数据发布示例代码吗?@askerovlab否如果你想创建一个新数组,你可以这样做:this.arraydata=this.arraydata.slice().sort(…
我可以看到对象正在将秒和纳秒转换为日期,但不能确定是否是。这里是小提琴:我按顺序获得它们“CeNP27551idLysSJOd5H”、“8GFUT6NEK2I91HIVKFY”、“9jHfOD8ZIAOX4fE1KUQc”、“Epd2PVKyUeAmrzBT3ZHT”这是升序。啊,我有两个选项卡,它们有不同的网络数据集,我看的是不同的选项卡…它工作,只是一件事,当我将这种排序应用到其他数据集时,它说“类型参数”(a:any,b:any)=>boolean“不能分配给类型参数”(a:any,b:any)=>number',……尽管我给出了分钟(-)它并没有比symbol更大,而是在工作,我搜索了一些,但不明白为什么它不能在diff数据集上工作,虽然它的结构是same@Md.ParvezAlam事实上,我意识到你对比较函数的看法是正确的-它返回一个数字,其中>0表示大于,@Md.ParvezAlam我更新了答案。请记住接受如果它对你有帮助,那就太好了。
let sortedData = data.sort((a:any, b:any) => {
let bd = objToDate(b.element.updatedOn);
let ad = objToDate(a.element.updatedOn);
return ad - bd
});
return bd - ad