内容简介:將結果依日期排序,且最新日期在第一筆也是實務上常見需求,由於 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 一樣,將兩數直接相減,但結果不如預期。
發現根本沒有排序。
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 後,就可以直接相減了。
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-fp
的 diff()
。
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 後相減。
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()
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()
繼續使用。
Conclusion
- 雖然根據日期排序的方法很多,但只要能重構出
sortByDate()
higher order function,將來只要傳入 property 名稱就可簡單使用
Reference
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间
- AYUI内置的万能日期控件-日期表达式
- oracle 日期格式化(yyyymmdd)及常规日期计算大全
- ElasticSearch中的日期映射为Hive中的日期格式
- 将日期时间列表与Python中的日期时间进行比较
- Python 日期和时间
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法技术手册
[美]海涅曼 (Heineman.G.T.)、[美]波利切 (Pollice.G.)、[美]塞克欧 (Selkow.S.) / 东南大学出版社 / 2009-4 / 58.00元
创造稳定的软件需要有效的算法,但是程序设计者们很少能在问题出现之前就想到。《算法技术手册(影印版)》描述了现有的可以解决多种问题的算法,并且能够帮助你根据需求选择并实现正确的算法——只需要一定的数学知识即可理解并分析算法执行。相对于理论来说,本书更注重实际运用,书中提供了多种程序语言中可用的有效代码解决方案,可轻而易举地适合一个特定的项目。有了这本书,你可以: 解决特定编码问题或改进现有解决......一起来看看 《算法技术手册》 这本书的介绍吧!