自行組合 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()


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

查看所有标签

猜你喜欢:

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

Web之困:现代Web应用安全指南

Web之困:现代Web应用安全指南

(美)Michal Zalewski / 朱筱丹 / 机械工业出版社 / 2013-10 / 69

《web之困:现代web应用安全指南》在web安全领域有“圣经”的美誉,在世界范围内被安全工作者和web从业人员广为称道,由来自google chrome浏览器团队的世界顶级黑客、国际一流安全专家撰写,是目前唯一深度探索现代web浏览器安全技术的专著。本书从浏览器设计的角度切入,以探讨浏览器的各主要特性和由此衍生出来的各种安全相关问题为主线,深入剖析了现代web浏览器的技术原理、安全机制和设计上的......一起来看看 《Web之困:现代Web应用安全指南》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具