Ramda 之 symmetricDifference() Series

栏目: JavaScript · 发布时间: 5年前

内容简介:VS Code 1.33.1Quokka 1.0.209

sysmmetricDifference() 是較少用的 Function,跟 difference() 有點類似,但又不太一樣。

Version

VS Code 1.33.1

Quokka 1.0.209

Ramda 0.26.1

Functional

import { concat, difference } from 'ramda';

let first = [1, 3, 5, 7];
let second = [1, 4, 7];

let symmetricDifference = (arr1, arr2) => concat(
  difference(arr1, arr2),
  difference(arr2, arr1)
);

console.log(symmetricDifference(first, second));

想知道哪些 element 沒有同時存在於 firstsecond array,若不知道 Ramda 提供了 symmetricDifference() ,其實也可以由 difference() 組合出來:

  1. 先使用 difference() 找出 first 不在 second 的 element
  2. 再使用 difference() 找出 second 不在 first 的 element
  3. 將兩個 array concat() 起來

Ramda 之 symmetricDifference() Series

symmetricDifference()

Value

import { symmetricDifference } from 'ramda';

let first = [1, 3, 5, 7];
let second = [1, 4, 7];

console.log(symmetricDifference(first, second));

Ramda 提供了 symmetricDifference() ,其實也是由 difference()concat() 組合出來的。

symmetricDifference()

[*] → [*] → [*]

回傳不同時存在於兩個 array 的 element

Ramda 之 symmetricDifference() Series

Object

import { symmetricDifference } from 'ramda';

let first = [
  { firstName: 'Sam',   lastName: 'Xiao'},
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jimmy', lastName: 'Huang'},
];

let second = [
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jessie', lastName: 'Hsieh'},
];

console.dir(symmetricDifference(first, second));

firstsecond 的 element 為 object,想得知不同時存在於兩個 array 的 object 有哪些, symmetricDifference() 依然適用。

ECMAScript 的 === ,對於 object 是 reference equality,但以處理 data 角度而言,這並沒有實質用處,而 symmetricDifference() 比較的是 value equality,也就是 property 相等,就視為兩個 object 相等,這在實務上非常有用

Ramda 之 symmetricDifference() Series

symmetricDifferenceWith()

Value

Non Point-free

import { symmetricDifferenceWith } from 'ramda';

let first = [1, 3, 5, 7];
let second = [1, 4, 7];

console.log(symmetricDifferenceWith((x, y) => x === y, first, second));

symmetricDifference() 提供的是內定的比較方式,而 symmetricDifferenceWith() 可提供自訂的 predicate。

symmetricDifferenceWith()

((a, a) → Boolean) → [a] → [a] → [a]

回傳不同時存在於兩個 array 的 element,但可提供 predicate function 客製化

((a, a) → Boolean) :決定判斷相等的 predicate function

[a] :第一個 array

[a] :第二個 array

[a] :回傳不同時存在於兩個 array 的 element

Ramda 之 symmetricDifference() Series

Point-free

import { symmetricDifferenceWith, equals } from 'ramda';

let first = [1, 3, 5, 7];
let second = [7, 1, 4];

console.log(symmetricDifferenceWith(equals, first, second));

symmetricDiffernceWith() 的 predicate,也可以使用 equals() 使其 point-free。

Ramda 之 symmetricDifference() Series

Object

Non Point-free

import { symmetricDifferenceWith } from 'ramda';

let first = [
  { firstName: 'Sam',   lastName: 'Xiao'},
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jimmy', lastName: 'Huang'},
];

let second = [
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jessie', lastName: 'Hsieh'},
];

let predicate = (x, y) => x.firstName === y.firstName && x.lastName === y.lastName;
console.dir(symmetricDifferenceWith(predicate, first, second));

symmetricDifference() 也可以搭配 symmetricDifferenceWith() 使用自己的 predicate,此例完全與 symmetricDifference() 相同。

symmetricDifferenceWith() 可貴之處在於自訂 predicate,如只比較 lastName 即可,不用比較 firstName ,若沒有特別之處,使用 symmetricDifference() 即可

Ramda 之 symmetricDifference() Series

Point-free

import { symmetricDifferenceWith, allPass, eqProps } from 'ramda';

let first = [
  { firstName: 'Sam',   lastName: 'Xiao'},
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jimmy', lastName: 'Huang'},
];

let second = [
  { firstName: 'Kevin', lastName: 'Yang'},
  { firstName: 'Jessie', lastName: 'Hsieh'},
];

let predicate = allPass([
  eqProps('firstName'),
  eqProps('lastName')
]);
console.dir(symmetricDifferenceWith(predicate, first, second));

若 predicate 有多個條件,就很適合使用 allPass() 使其 point-free,且每個條件又可使用 eqProps() ,也是 point-free。

allPass()eqProps() 組合就是典型 point-free 使程式碼可讀性更高的典範

Ramda 之 symmetricDifference() Series

Conclusion

  • symmetricDifference()symmetricDifferenceWith() 可輕易找出不同時存在於兩個 array 的部分,尤其對於 object 是比較其 value equality,而不是 reference equality,非常實用
  • symmetricDifferenceWith() 對於 object,可使用 allPass()eqProps() 使其 point-free,非常經典

Reference

Ramda , symmetricDifference()

Ramda , symmetricDifferenceWith()

Ramda , equals()

Ramda , allPass()

Ramda , eqProps()


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

运营笔记

运营笔记

类延昊 / 天津人民版社 / 2016-12-1 / CNY 39.80

运营是入门浅但学问深的行当。一个入门很久的人不见得能在11年内爬到塔尖,同样一个初入龙门的人占据高位也不见得非用11年。 到底该怎么做运营?如何做运营才不至于让自己忙死累死甚至茫然不知所措?如何和用户进行有效沟通?如何把握住处于塔尖20%的核心用户?如何强敌逼阵时快速找到突破口?如何挤破头皮提高转化率? 在这本书里,类类以自己常年战斗在一线摸爬滚打的经验给予了有效而真诚的解答。一起来看看 《运营笔记》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具