繁体   English   中英

拉姆达滤镜零道具

[英]Ramda filter null prop

我有事件对象数组,看起来像:

{
    date: "2015-06-03T19:29:01.000Z",
    description: "Test",
    talks: [{
        author: "Nick",
        tags: ["tag1", "tag2", "tag3"]
    }]
} 

我只想从该对象获取标签,所以我使用Ramda像这样:

let eventTags = pipe(prop('talks'), map(prop('tags')), flatten, uniq)
... 
eventTags(event); //and call function on event object

但是在某些情况下,事件对象如下所示:

{
    date: "2015-06-03T19:29:01.000Z",
    description: "Test",
    talks: [{
        author: "Nick",
        tags: null
    }]
} 

所以我在eventTags数组中得到了[null] ,但我想改为得到一个空数组。 那么如何过滤null?

我会提倡一种解决方案,该解决方案可以使用镜头访问tags并使用RamdaSanctuaryundefined视为Maybe Nothing

const x = [{
  date: "2015-06-03T19:29:01.000Z",
  description: "Test",
  talks: [{
    author: "Nick",
    tags: ["tag1", "tag2", "tag3"]
  }]
}, {
  date: "2015-06-03T19:29:01.000Z",
  description: "Test",
  talks: [{
    author: "Nick",
    tags: null
  }]
}]

const viewTalks = S.compose ( S.toMaybe ) ( 
  R.view ( R.lensProp( 'talks' ) ) 
)

const viewTags = S.compose ( S.toMaybe ) ( 
  R.view ( R.lensProp ( 'tags' ) ) 
)

const allTalkTags = S.map ( S.pipe ( [
  S.map ( viewTags ),
  S.justs,
  R.unnest
] ) )

const allTalksTags = S.pipe( [
  S.map ( S.pipe( [
    viewTalks,
    allTalkTags
  ] ) ),
  S.justs,
  R.unnest,
  R.uniq
] )

// outputs: ['tag1', 'tag2', 'tag3']
allTalksTags ( x )

单击以运行工作示例

您可以在此处利用R.defaultTo([])创建一个函数,如果接收到null或未定义的值,则该函数将返回一个空数组,否则将值传递给未修改的对象。

const eventTags = pipe(
  prop('talks'),
  map(pipe(prop('tags'), defaultTo([]))),
  flatten,
  uniq
)

在MatíasFidemraizer的帮助下,我将eventTags函数更改为:

const viewTags = talk => !!talk.tags ? talk.tags : [];

export let eventTags = pipe(prop('talks'), map(viewTags), flatten, uniq)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM