2016-12-14 5 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'] 
}); 

Дело в том, что функции по умолчанию заданы. Таким образом, частичное приложение приходит естественным образом. В нем также есть объективы, которые потрясающе!