我目前正在学习使用 Ramda.js 的传感器。(太有趣了,耶!)
我发现这个问题描述了如何首先过滤数组,然后使用传感器对其中的值求和。
我想做一些类似但不同的事情。我有一组具有时间戳的对象,我想平均时间戳。像这样的东西:
const createCheckin = ({
timestamp = Date.now(), // default is now
startStation = 'foo',
endStation = 'bar'
} = {}) => ({timestamp, startStation, endStation});
const checkins = [
createCheckin(),
createCheckin({ startStation: 'baz' }),
createCheckin({ timestamp: Date.now() + 100 }), // offset of 100
];
const filterCheckins = R.filter(({ startStation }) => startStation === 'foo');
const mapTimestamps = R.map(({ timestamp }) => timestamp);
const transducer = R.compose(
filterCheckins,
mapTimestamps,
);
const average = R.converge(R.divide, [R.sum, R.length]);
R.transduce(transducer, average, 0, checkins);
// Should return something like Date.now() + 50, giving the 100 offset at the top.
当然average
,正如上面所说的那样,它不能工作,因为变换函数的工作方式就像一个减少。
我发现我可以在换能器之后一步完成。
const timestamps = R.transduce(transducer, R.flip(R.append), [], checkins);
average(timestamps);
但是,我认为必须有一种方法可以使用迭代器函数(转换器的第二个参数)来做到这一点。你怎么能做到这一点?或者也许average
必须是transducer
(使用compose
)的一部分?