我正在努力学习Ramda,但在文档中找不到它与Lodash _.transform函数等价的内容:
_.transform([2, 3, 4], function(result, n) {
result.push(n *= n);
return n % 2 == 0;
}, []);
// => [4, 9]发布于 2019-12-19 16:56:18
不,如果我正确理解这个功能的话。兰达可能永远不会对这种行为感兴趣。事实上,当人们试图对Ramda做类似的事情时,他们最终会感到沮丧。(免责声明:我是Ramda的核心贡献者之一。)
定制师指出的似乎是拉姆达设法处理的_.transform的一个特征--提前退出。使用reduced使这成为可能,但我也很少使用它。
但是提供给它的函数的全部要点(以iteratee的术语表示)是对累加器对象进行变异。除非您通过返回end the madness发送false信号,否则将忽略它的返回。而且只有它的副作用才是重要的。
Ramda是为了避免突变而设计的。当您使用Ramda的reduce折叠到列表中时,强烈的期望是您将使用concat而不是push;换句话说,您不会改变输入。Ramda什么也不做,而且出于性能原因,有时也会避开这种期望,但是在调用之间共享累加器时,您可能需要小心。但拉姆达当然不太可能让事情变得更容易。任何只用于副作用的功能对Ramda来说都是一种诅咒。(请不要让我想起forEach!“愚蠢的一致性是小聪明的妖精。”)
注意,定制指挥官的答案并没有试图修改acc值,而是返回了一个新的答案:这是非常惯用的Ramda。
另外,如果没有提供初始累加器,则lodash愿意创建一个初始累加器。Ramda不允许任何可选参数。它们只是不同的设计。
重要的一点是,没有特别的理由期望每个房客功能都有一个对应的拉姆达。Ramda是独立开发的,目标是一种不同的编码风格,受不同的约束,而且从来没有设计成为一种插入替代。因此,它与房客的关系是非常不同的,与房客的关系强调。
它们的重叠程度和它们所做的一样,证明了许多功能的基本性质,它们都是支持的。当然,也有一个不可忽略的反馈循环,要求从一个库中找到另一个库中的函数;但我认为,大部分功能是广泛需要的,这要重要得多。
发布于 2019-12-19 15:24:51
据我所见,_.transform类似于Array#reduce,只是它可以被打断:
_.transform([2, 3, 4], function(result, n) {
result.push(n *= n);
return n % 2 == 0;
}, []);
// => [4, 9]有了兰达,你也可以用reduce做同样的事情
迭代器函数接收两个值:(acc,value)。它可以使用R.reduced来快捷迭代。
在拉姆达,上述守则是:
const transform =
reduce((acc, x) =>
(x % 2 ? reduced : identity)
([...acc, x * x]), []);
transform([2, 3, 4]);
//=> [4, 9]您可以使用reduced将累加器acc封装在一个特殊的对象中,该对象告诉Ramda的reduce函数以快捷迭代。
identity函数返回它的参数。例如identity(42) === 42。
因此,基本上,我在每次迭代中所做的是:
reduced还是identity?[...acc, x * x]调用该函数在伪码中:
( stop ? reduced OR identity )(next_accumulator_value)https://stackoverflow.com/questions/59411710
复制相似问题