首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种更惯用的书写圣管的方法

一种更惯用的书写圣管的方法
EN

Stack Overflow用户
提问于 2019-11-15 02:38:19
回答 1查看 260关注 0票数 1

我编写了一个代码片段来提取source对象键(应该是未知的),所以我添加了一个要提取的不存在的键baz。我提取的数组中的每个元素--我想添加从其中提取它的键,然后将结果扁平化,以得到一个数组。

我在编写代码时遇到了两个主要问题:

当尝试使用

  1. 时,它总是返回一个错误,因为对象值(数字{r:**<<number>>**})的类型与我试图添加到键Section (例如{'Section': **'foo'**})的字符串不同。最后,为了传达我的意图,我改变了对象。

  1. ,我没有写一个正确的映射函数,它可以抽象出Maybe,并允许我访问里面的变量。因此,我必须使用Maybe.
  2. Is,然后将值重新包装到sanctuary

中,这是一种更好的表达下面用sanctuary编写的逻辑的方法。

代码片段:

代码语言:javascript
复制
const S = require('sanctuary');
const source = {
  foo: [{ r: 1 }, { r: 2 }, { r: 3 }],
  bar: [{ r: 4 }, { r: 5 }, { r: 6 }],
}

const result =
  S.pipe([
    S.map(
      prop => {
        const nullable = S.maybeToNullable(S.value(prop)(source))
        return nullable ? S.Just(nullable.map(val => {val['Section'] = prop; return val})) : S.Nothing
      }
    ),
    S.justs,
    S.reduce(xs => x => [...xs, ...x])([])
  ])(['foo', 'bar', 'baz'])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-15 11:08:17

这是我的解决方案:

代码语言:javascript
复制
const S = require ('sanctuary');

//    source :: StrMap (Array { r :: Integer })
const source = {
  foo: [{r: 1}, {r: 2}, {r: 3}],
  bar: [{r: 4}, {r: 5}, {r: 6}],
  quux: [{r: 7}, {r: 8}],
};

//    result :: Array { r :: Integer, Section :: String }
const result =
S.filter (S.compose (S.flip (S.elem) (['foo', 'bar', 'baz']))
                    (S.prop ('Section')))
         (S.chain (S.pair (s => S.map (S.unchecked.insert ('Section') (s))))
                  (S.pairs (source)));

有几件事需要注意:

在这种情况下,

  • S.pipe不太自然,因为有两个输入(source['foo', 'bar', 'baz'])。使用pipeline.
  • S.insert中的S.pipe需要硬编码其中一个输入不能用于更新记录,但是S.unchecked.insert可以用于此目的。当我所知道的声音表达式被类型checker.
  • It's认为不健全时,我很高兴能够抑制类型检查,因为我不清楚输出顺序是否重要。您的解决方案尊重节名数组的顺序,而我的解决方案不尊重。让我知道输出订单是否重要。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58869573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档