簡體   English   中英

Ramda地圖和過濾器在一個循環

[英]Ramda map and filter in one loop

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的傳感器進行此操作。

(免責聲明:我是Ramda作家)

常規的Ramda函數的常規組合會在每次列表轉換時循環,而經過轉換的函數會在每次迭代時運行組合中的每個函數。 請注意,由於技術原因,使用換能器時,合成順序相反。

並非每個功能都是傳感器。 文檔使用此注釋來表示一個注釋:“如果在列表中給出了變壓器,則充當傳感器。” 這包括在mapfilter 有多種功能使使用換能器變得更加容易。 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的實現增加了很多復雜性,並且有人談論刪除它們,或者試圖找到一種使它們成為可選方法的方法。 但是對此並沒有做太多的事情。

當然可以。

const expr = R.compose(
    R.map(x => x * 100),
    R.filter(x => x > 5)
);
const result = expr([1, 2, 3, 4, 5, 6, 7, 8]);
console.log(result);

更新:單循環方式:

const iter = (acc, x) => (x > 5 && acc.push(x * 100), acc)
const result = R.reduce(iter, [], [1, 2, 3, 4, 5, 6, 7, 8])

無論是單循環還是雙循環,執行相同的邏輯,都應該沒有區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM