自行組合 sortByDate() 根據日期排序

栏目: 编程语言 · 发布时间: 6年前

内容简介:將結果依日期排序,且最新日期在第一筆也是實務上常見需求,由於 Date 特性,排序時並不像 Number、String 那樣簡單,須自行實作 Comparator Function,由於經常使用,可自行組出macOS Mojave 10.14.5VS Code 1.35.1

將結果依日期排序,且最新日期在第一筆也是實務上常見需求,由於 Date 特性,排序時並不像 Number、String 那樣簡單,須自行實作 Comparator Function,由於經常使用,可自行組出 sortByDate()

Version

macOS Mojave 10.14.5

VS Code 1.35.1

Quokka 1.0.227

Ramda 0.26.1

sort()

import { sort } from 'ramda';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// fn :: [a] -> [a]
let fn = sort(
  (x, y) => y.release - x.relase
);

console.dir(fn(data));

release 為各書的 發行日期 ,我們希望依發行日期 release 排序,且最新日期放在第一筆。

sort()

((a, a) → Number) → [a] → [a]

自行提供 comparator function 將 array 排序

(a, a) -> Number :自行提供 comparator function 比較

[a] :data 為 array

[a] :排序過後新 array

直覺會如處理 number 一樣,將兩數直接相減,但結果不如預期。

自行組合 sortByDate() 根據日期排序

發現根本沒有排序。

自行組合 sortByDate() 根據日期排序

Date.prototype.getTime()

import { sort } from 'ramda';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// fn :: [a] -> [a]
let fn = sort(
  (x, y) => new Date(y.release).getTime() - new Date(x.relase).getTime()
);

console.dir(fn(data));

使用 getTime() 轉成 number 後,就可以直接相減了。

自行組合 sortByDate() 根據日期排序

diff()

import { sort } from 'ramda';
import { diff } from 'date-fp';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// fn :: [a] -> [a]
let fn = sort(
  (x, y) => diff('seconds', new Date(x.release), new Date(y.release))
);

console.dir(fn(data));

若你不想轉成 number 相減,而想直接 date 相減,就要引入 date-fpdiff()

自行組合 sortByDate() 根據日期排序

Date.parse()

import { sort } from 'ramda';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// fn :: [a] -> [a]
let fn = sort(
  (x, y) => Date.parse(y.release) - Date.parse(x.release)
);

console.dir(fn(data));

也可以使用 Date.parse() 將 string 轉成 number 後相減。

自行組合 sortByDate() 根據日期排序

Point-free

import { sort, useWith, prop, pipe, subtract, flip } from 'ramda';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// fn :: [a] -> [a]
let fn = sort(useWith(
  flip(subtract), [
    pipe(prop('release'), Date.parse),
    pipe(prop('release'), Date.parse),
  ]
  )
);

console.dir(fn(data));

也可使用 useWith() 進一步將 sort() 的 callback 給 point-free。

自行組合 sortByDate() 根據日期排序

sortByDate()

import { sort } from 'ramda';

let data = [
  { title: 'FP in JavaScript', release: '2016-06-18 07:43:14'},
  { title: 'RxJS in Action', release: '2017-08-04 03:24:18'},
  { title: 'Speaking JavaScript', release: '2017-03-24 17:08:39'}
];

// sortByDate -> String -> [a] -> [a]
let sortByDate = date => sort(
  (x, y) => Date.parse(y[date]) - Date.parse(x[date])
);

console.dir(sortByDate('release')(data));

由於根據日期降冪 排序 在實務上經常使用,因此抽出 sortByDate() higher order function,只要傳入 property 名稱,即可回傳客製化的 sort() 繼續使用。

自行組合 sortByDate() 根據日期排序

Conclusion

  • 雖然根據日期排序的方法很多,但只要能重構出 sortByDate() higher order function,將來只要傳入 property 名稱就可簡單使用

Reference

Ramda , sort()

Ramda , useWith()

Ramda , prop()

Ramda , pipe()

Ramda , subtract()

Ramda , flip()

MDN , Date.prototype.getTime()

MDN , Date.parse()

date-fp , diff()


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UML基础与Rose建模案例

UML基础与Rose建模案例

吴建 / 人民邮电出版社 / 2004-10 / 29.00元

《UML 基础与Rose建模案例》介绍了用UML(统一建模语言)进行软件建模的基础知识以及Rational Rose工具的使用方法,其中,前8章是基础部分,对软件工程思想、UML的相关概念、Rational Rose工具以及RUP软件过程等进行了详细的介绍;后3章是案例部分,通过3个综合实例,对UML建模(以Rose为实现工具)的全过程进行了剖析;最后的附录中给出了UML中常用的术语、标准元素和元......一起来看看 《UML基础与Rose建模案例》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具