是否有一种更实用的方法可以实现以下目标,也许是使用Ramda?
var time = 100;
sequenceInstruments.forEach(function(instrument){
if(instrument.on)
{
playInstrument(time, instrument.duration);
}
})
答案 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))
);