Ramda地图和过滤器在一个循环

use*_*092 1 javascript node.js ramda.js

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))

}
Run Code Online (Sandbox Code Playgroud)

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

我的例子:

return data.map(R.pipe(map, filter))
Run Code Online (Sandbox Code Playgroud)

回来了

Array [
  600,
  700,
  800,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
  true,
]
Run Code Online (Sandbox Code Playgroud)

我需要它成为 [600, 700, 800]

Sco*_*yet 5

您可以使用Ramda的传感器进行此操作。

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

常规的Ramda函数的常规合成将在每个列表转换中循环,而经过转换的函数将在每次迭代中运行合成中的每个函数。请注意,由于技术原因,使用换能器时,合成顺序相反。

并非每个功能都是传感器。文档使用此注释来表示一个注释:“如果在列表中给出了变压器,则充当传感器。” 包含在map和中filter。有多种功能使使用换能器变得更加容易。 into是其中之一。

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

const filterMap = curry((f, m, data) => reduce(
  (a, i) => f(i) ? append(m(i), a) : a, 
[], data))
Run Code Online (Sandbox Code Playgroud)

const filterMap = curry((f, m, data) => reduce(
  (a, i) => f(i) ? append(m(i), a) : a, 
[], data))
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)

如果要查看换能器如何发光,请take(2)在合成的末尾添加a 。

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

  • 我的建议是,您将使用最简单的代码,直到发现确实有必要进行优化为止。通常,这样的多个循环执行得很好。 (2认同)