使用Ramda执行子数组的功能方法

时间:2016-09-07 07:52:05

标签: javascript functional-programming ramda.js

是否有一种更实用的方法可以实现以下目标,也许是使用Ramda?

var time = 100;

sequenceInstruments.forEach(function(instrument){
    if(instrument.on)
    {
       playInstrument(time, instrument.duration);
    }
})

3 个答案:

答案 0 :(得分:3)

通过仅以无点的方式使用Ramda的函数,您的示例将看起来像这样。

      Y   Y1
1:    1    1
2:    2    2
3:    3    3
4:    4    4
5:    5    5
6:  6/7    6
7: 8-10    8

但是我常常认为将它回拨一点可能会更好,使用匿名函数可能会使代码更具可读性并更清晰地传达意图。

const play = R.forEach(R.when(R.prop('on'),
                              R.compose(R.partial(playInstrument, [time]),
                                        R.prop('duration'))))
play(sequenceInstruments)

答案 1 :(得分:1)

虽然我同意斯科特·克里斯托弗的看法,如果您有兴趣开发无点版本,并且有兴趣开发无点版本,那么这个有效的解决方案比任何无点版本都更容易理解。你希望time成为你最终函数的参数,Ramda提供了一个可能有帮助的函数,useWith。 (这也是一个相关的功能,converge对于稍微不同的情况很有用。)这取决于你的playInstrument功能被咖喱:

const play = R.useWith(R.forEach, [
  playInstrument, 
  R.compose(R.pluck('duration'), R.filter(R.prop('on')))
]);

play(100, sequenceInstruments);

您可以在 Ramda REPL 上看到这一点。

答案 2 :(得分:1)

我同意@ftor:filter将允许您以更线性的方式进行构图,从而产生完全可读的无点代码。

const play = pipe(
    filter(prop('on')),           // take only the instruments that are 'on'
    map(prop('duration')),        // take the duration of each of those
    forEach(playInstrument(100))  // play'm all
);

play(sequenceInstruments);

这假设playInstruments已经过了。

使用lodash/fp的缩写,你甚至可以这样做:

const play = pipe(
    filter('on'),
    map('duration'),   
    forEach(playInstrument(100))
);