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
    对象不能转换为日期。你需要做额外的工作
  • JavaScript不支持纳秒,只支持毫秒。因此,你需要将这个数字除以一百万
  • 通过使用
    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