2016-12-14 46 views
0

我是新來函數式編程,我試圖重構我的代碼沒有副作用。如何在JavaScript中使用Lodash以功能性的方式做到這一點?

let keywords = _.get(content, '[0].keywords', []); 
keywords = keywords.slice(0, config.keywordLimit); 

我使用lodash。我相信你可以鏈接這兩種方法,就像這樣。

const keywords = _.get(content, '[0].keywords', []).slice(0, config.keywordLimit); 

但我只是想知道是否有在JavaScript這樣做的更多的功能呢?

+2

這就是我會這樣做的。 –

回答

2

基本上,功能風格都是關於構圖。下面是一個示例:

var get = _.curry(_.flip(_.get), 3); 
 
var slice = _.curry(_.flip(_.slice), 3); 
 

 
var comp = function(f, g) { 
 
    return function(x) { 
 
    return f(g(x)); 
 
    } 
 
}; 
 

 
var config = { 
 
    keywordLimit: 2 
 
}; 
 

 
var program = comp(
 
    slice(config.keywordLimit, 0), 
 
    get([], 'x') 
 
) 
 

 
var x = program({ 
 
    x: ['abc', 'qwe', 'sdf'] 
 
}); 
 

 
console.log(x);
<script src="https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.min.js"></script>

在的情況下,這種小提琴是不行的,這裏的jsbin:http://jsbin.com/gicocivife/edit?js,console

注重醜陋curry(flip(get))curry(flip(slise))。問題在於,lodash中的函數具有這樣的參數順序,以至於無法組合。你的函數需要數據處理,對嗎?因此,這個數據的論據必須是最後一個。因此,您可以編寫功能。我建議看看拉姆達。不僅從我的角度來看,這是FP的一個很棒的圖書館。這是用它寫的同一個例子。

var config = { keywordLimit: 2 }; 

var program = compose(
    slice(0, config.keywordLimit), 
    view(lensProp('x')) 
) 

program({ 
    x: ['abc', 'qwe', 'sdf'] 
}); 

事情是,功能默認爲咖喱。因此,部分應用是自然而然的。它還具有鏡頭,這是一件很棒的事情!