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

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

内容简介:將結果依日期排序,且最新日期在第一筆也是實務上常見需求,由於 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()


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

查看所有标签

猜你喜欢:

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

算法技术手册

算法技术手册

[美]海涅曼 (Heineman.G.T.)、[美]波利切 (Pollice.G.)、[美]塞克欧 (Selkow.S.) / 东南大学出版社 / 2009-4 / 58.00元

创造稳定的软件需要有效的算法,但是程序设计者们很少能在问题出现之前就想到。《算法技术手册(影印版)》描述了现有的可以解决多种问题的算法,并且能够帮助你根据需求选择并实现正确的算法——只需要一定的数学知识即可理解并分析算法执行。相对于理论来说,本书更注重实际运用,书中提供了多种程序语言中可用的有效代码解决方案,可轻而易举地适合一个特定的项目。有了这本书,你可以: 解决特定编码问题或改进现有解决......一起来看看 《算法技术手册》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

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

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器