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()


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

查看所有标签

猜你喜欢:

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

数据结构

数据结构

殷人昆 / 清华大学 / 2007-6 / 39.00元

《数据结构》(第2版)“数据结构”是计算机专业的核心课程,是从事计算机软件开发和应用人员必备的专业基础。随着计算机的日益普及,“数据结构”课程也在不断地发展。《数据结构》(第2版)按照清华大学计算机系本科“数据结构”大纲的要求,从面向对象的概念、对象类设计的风格和数据结构的层次开始,从线性结构到非线性结构,从简单到复杂,深入地讨论了各种数据结构内在的逻辑关系及其在计算机中的实现方式和使用。此外,对......一起来看看 《数据结构》 这本书的介绍吧!

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

HTML 编码/解码

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

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具