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

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

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


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

查看所有标签

猜你喜欢:

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

IT大败局

IT大败局

Merrill R.Chapman、周良忠 / 周良忠 / 电子工业出版社 / 2004-8-1 / 35.00

这是一本由作者亲身经历写就的MBA式教案。通过作者那专业人士的敏锐、活泼流畅的文笔和美国人特有的幽默,本书为我们剖析了IT界十个有代表性且影响深远的愚蠢败局。这十个败局涉及企业经营的十个主要方面,它们是:产业标准的魔力,“缩水”产品的阴霾,产品定位的泥潭,市场关系的教训,巨型企业的困惑,企业并购的陷阱,品牌战略的迷茫,技术导向的失衡,企业公关的真谛和科技虚幻的诱惑。 书中有许多鲜为人......一起来看看 《IT大败局》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

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

在线XML、JSON转换工具

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

Markdown 在线编辑器