2016-12-14 3 views
0

Ich bin neu in der funktionalen Programmierung und ich versuche, meinen Code umzufunktionieren, um keine Nebenwirkung zu haben.Wie funktioniert das in JavaScript mit Lodash?

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

Ich benutze Lodash. Ich glaube, du kannst diese beiden Methoden einfach verketten und so etwas sein.

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

Aber ich frage mich nur, ob es eine funktionellere Art, dies in JavaScript zu tun?

+2

So würde ich es machen. –

Antwort

2

Grundsätzlich geht es beim funktionalen Stil um Komposition. Hier ist ein Beispiel:

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>

Im Fall geht diese Geige nicht funktioniert, hier ist jsbin: http://jsbin.com/gicocivife/edit?js,console

Achten Sie auf hässliche curry(flip(get)) und curry(flip(slise)). Das Problem ist, dass Funktionen in lodash eine solche Reihenfolge von Argumenten haben, die Sie von der Zusammensetzung abhält. Ihre Funktion erwartet, dass mit Daten gearbeitet wird, richtig? Daher muss das Argument für diese Daten das letzte sein. Daher können Sie Funktionen zusammenstellen. Ich würde empfehlen, Ramda anzusehen. Nicht nur aus meiner Sicht ist dies eine großartige Bibliothek für FP. Hier ist das gleiche Beispiel geschrieben.

var config = { keywordLimit: 2 }; 

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

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

Die Sache ist, Funktionen sind standardmäßig curried. Daher kommt die teilweise Anwendung natürlich. Es bietet auch Linsen, was eine tolle Sache ist!