【问题标题】:Sorting array of object javascript / typescript on firestore timestamp在firestore时间戳上对对象javascript / typescript数组进行排序
【发布时间】:2018-10-11 11:47:24
【问题描述】:

我有下面的数组结构

[
  {
    "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"
  }
]

以下代码进行排序

示例 JSfiddle

http://jsfiddle.net/68wvebpz/

 let sortedData = this.arraydata.sort((a:any, b:any) => { return Number(new Date(b.element.date).getTime()) - Number(new Date(a.element.date).getTime()) })

这不会产生任何影响。

【问题讨论】:

  • 不要发布文字图片。而且,我不知道你在做什么,但你可以简单地做(a, b) => b.element.date - a.element.date
  • .sort 方法不会改变数组,它会返回一个新数组。问题可能是您忘记将结果分配给 this.arraydata 吗? (它确实发生了变异,是错误的)
  • 我尝试了很多变体,比如简单地 a.element.date、new date(a.element.data) 然后尝试 Number(new date(a.element.date),但没有任何效果
  • 你能发布你的示例代码和数据吗?
  • @askerovlab No sort mutates 如果你想创建一个新数组,你可以这样做:this.arraydata = this.arraydata.slice().sort(...

标签: javascript angular typescript sorting google-cloud-firestore


【解决方案1】:

有几个问题需要我们解决:

  1. 您的updatedOn 对象不是可以转换为日期的对象。你需要做额外的工作。
  2. JavaScript 不支持纳秒,只支持毫秒。因此,您需要将该数字除以一百万。
  3. 通过使用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 月我使用您的测试数据的日期。

然后,为了比较它们并解决剩下的问题,使用这个(更简单的)表格:

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

【讨论】:

  • 我可以看到 objToDate 正在将秒和纳秒转换为日期,但它没有排序
  • 当然可以。这是小提琴:jsfiddle.net/cobusk/68wvebpz/3我按“CeNP27551idLysSJOd5H”、“8gFUT6neK2I91HIVkFfy”、“9jHfOD8ZIAOX4fE1KUQc”、“Epd2PVKyUeAmrzBT3ZHT”的顺序得到它们。这是按升序排列的。
  • aah,我有两个带有不同数据集的选项卡,我正在查看不同的选项卡...它的工作,只是一件事,当我将这种排序应用于其他数据集时,它说“类型参数'(a: any, b: any) => boolean' 不能分配给 '(a: any, b: any) => number' 类型的参数,......虽然当我给了一个 minues (- ) 而不是大于符号,它正在工作,我搜索了一些,但不明白为什么它在 diff 数据集上不起作用,虽然结构是相同的
  • @Md.ParvezAlam 实际上,我意识到您对比较函数是正确的 - 它返回一个数字,其中 >0 表示大于,
  • @Md.ParvezAlam 我更新了答案。如果对您有帮助,请记得采纳。
【解决方案2】:

将您的字符串转换为日期,然后将它们相减以获得负值、正值或零值:

array.sort(function(a,b){
    return new Date(b.date) - new Date(a.date);
});

【讨论】:

    【解决方案3】:

    是这样的吗:

    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)
    }))
    

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多