Ramda 之 symmetricDifference() Series

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

内容简介: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()


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

查看所有标签

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

Series 60 应用程序开发

Series 60 应用程序开发

巴克 / 人民邮电出版社 / 2005-7 / 75.0

Series 60智能手机开发平台正掀起新一轮的移动服务浪潮。超过60%的手机生产商获得了Series 60平台的授权。Series 60移动应用开发平台拥有最大的用户群,从而成为智能手机市场的代表。诺基亚与EMCC软件公司合作,为C++程序员和软件设计师编撰了这本Series 60开发的权威指南。本书由诺基亚资深专家进行了全面审阅。本书内容涉及了开发过程的各个阶段,从设计、编程、测试、调试到部署......一起来看看 《Series 60 应用程序开发》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

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

Markdown 在线编辑器