傳回第一個符合條件的資料

find() 為 Ramda 常用的 Operator,常搭配 propEq()equals() Operator 一併使用。

Version


WebStorm 2018.3.3
Quokka 1.0.134
Ramda 0.26.1

Imperative


1
2
3
4
5
6
7
8
9
10
11
12
13
const books = [
{id: 1, title: 'Functional Programming in JavaScript'},
{id: 2, title: 'RxJS in Action'},
{id: 3, title: 'Speaking JavaScript'},
];

const findBookById = (id, data) => {
for(let item of data)
if (item.id === id) return item;
};

const result = findBookById(1, books);
console.log(result);

簡單的需求,想找到 id1book object。

Imperative 會使用 for loop 搭配 if 判斷,若 id 找到就 return book object。

find000

Array.prototype


1
2
3
4
5
6
7
8
9
10
const books = [
{id: 1, title: 'Functional Programming in JavaScript'},
{id: 2, title: 'RxJS in Action'},
{id: 3, title: 'Speaking JavaScript'},
];

const findBookById = (id, data) => data.find(x => x.id === id);

const result = findBookById(1, books);
console.log(result);

Array.prototype 有內建 find(),只要傳入 Arrow Function 即可。

find001

find()


1
2
3
4
5
6
7
8
9
10
11
12
13
import { find, propEq } from 'ramda';

const books = [
{id: 1, title: 'Functional Programming in JavaScript'},
{id: 2, title: 'RxJS in Action'},
{id: 3, title: 'Speaking JavaScript'},
];

const finder = id => propEq('id', id);
const findBookById = (id, data) => find(finder(id), data);

const result = findBookById(1, books);
console.log(result);

Ramda 當然也有內建 find(),其 signature 為

find()
(a → Boolean) → [a] → a | undefined
傳回第一個符合條件的資料

a -> Booleanfind() 所需要的條件

[a]:data 為 array

a | undefined:若找到回傳為 a,找不到回傳 undefined

第二個參數要自行傳入 Arrow Function 亦可,Ramda 特別提供 propEq() HOF 產生這類 Arrow Function。

propEq()
String -> a -> Object -> Boolean
比對 object 的 property 與 value 是否相等

String:object 的 property

a:要比較的資料

Object:data 為 object

Boolean:若相等傳回 true,不相等傳回 false

find002

Q : propEq() 只適用於 array 內為 object,若為一般 value 呢 ?

1
2
3
4
5
import { find, equals } from 'ramda';

const data = [1, 2, 3];
const result = find(equals(1), data);
console.log(result);

Array 內若為一般 value,callback 就必須使用 equals()

equals()
a -> b -> Boolean
比對兩個一般 value 是否相等

a: 要找的資料

b:傳入的 data

Boolean:若找到傳回 true,找不到傳回 false

find003

Conclusion


  • find() 為 Ramda 常用的 operator,其 callback 可搭配 propEq()equals() 產生

Reference


Ramda, find()
Ramda, propEq()
Ramda, equals()