gpt4 book ai didi

javascript - Ramda 在一个循环中映射和过滤

转载 作者:行者123 更新时间:2023-11-30 08:23:29 24 4
gpt4 key购买 nike

const R = require('rambda')

export const test = () => {

const data = [1, 2, 3, 4, 5, 6, 7, 8]
const filter = no => no > 5
const map = no => no * 100

// looping 2 times
return data
.filter(filter)
.map(map)

// wird 1 loop
return data.reduce((data, no) => {
if (!filter(no)) return data
data.push(map(no))
return data
}, [])

// I want to do something like this.
return data.map(R.pipe(map, filter))

}

您好,请问是否可以使用ramda或rambda在一个循环中进行映射和过滤?

我的例子:

return data.map(R.pipe(map, filter))

回来了

Array [
600,
700,
800,
true,
true,
true,
true,
true,
true,
true,
true,
]

我需要它是 [600, 700, 800]

最佳答案

您可以使用 Ramda 的 transducers 来做到这一点.

(免责声明:我是 Ramda 作者)

虽然常规 Ramda 函数的正常组合将为每个列表转换循环,但转换的函数将在每次迭代中运行组合中的每个函数。请注意,出于技术原因,组合在使用换能器时以相反的顺序运行。

并非每个函数都是转换器。该文档使用此注释来指示一个:“如果转换器在列表位置给出,则充当转换器。”这包含在 map 中和 filter .有几个功能可以更轻松地使用换能器。 into就是其中之一。

不过,编写您自己的 filterMap 函数可能会更容易。不难:

const filterMap = curry((f, m, data) => reduce(
(a, i) => f(i) ? append(m(i), a) : a,
[], data))

const {compose, map, filter, into, curry, reduce, append} = R;

const data = [1, 2, 3, 4, 5, 6, 7, 8]
const gt5 = no => {console.log(`filter: ${no}`); return no > 5;}
const times100 = no => {console.log(`map ${no}`); return no * 100;}

console.log('========= Plain composition =========')
const transform1 = compose(map(times100), filter(gt5))
console.log(transform1(data))

console.log('========== With transducers =========')
const transform2 = into([], compose(filter(gt5), map(times100)));
console.log(transform2(data))

console.log('=========== With filterMap ==========')
const filterMap = curry((f, m, data) => reduce((a, i) => f(i) ? append(m(i), a) : a, [], data))
console.log(filterMap(gt5, times100)(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

如果您想看看换能器是如何发光的,请在组合的末尾添加一个take(2)

这些给 Ramda 的实现增加了很大的复杂性,并且有人讨论要删除它们,或者试图找到一种方法使它们成为可选的。但在这方面并没有做太多。

关于javascript - Ramda 在一个循环中映射和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49732081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com