代码之家  ›  专栏  ›  技术社区  ›  joshperry

我该怎么崩溃也许是圣殿里的蒙娜兹

  •  3
  • joshperry  · 技术社区  · 7 年前

    = .

    // Grab the tag with key in `tag`
    const getTag = (product, tag) =>
      product.Tags
        .split(',')
        .find(t => t.startsWith(`${tag}=`))
        .split('=')[1]
    
    getTag({Tags: 'a=y,b=z'}, 'a') // returns 'y'
    getTag({Tags: 'a=y,b=z'}, 'z') // returns boom (desired null)
    getTag({Tags: null}, 'a') // returns boom (desired null)

    所以我安装了保护区,并开始玩一个功能性的解决方案。这是我到目前为止所得到的,费用好像它很难看,这告诉我,我一定是做错了什么或使用了错误的工具。

    const getk = S.map(S.filter(S.test(/=/)))(S.splitOn(','))
    
    S.map(S.map(S.map(S.splitOn('='))))(S.map(getk))(S.toMaybe(null))
    // Nothing
    S.map(S.map(S.map(S.splitOn('='))))(S.map(getk))(S.toMaybe('a=y,b=z'))
    //Just ([["a", "y"], ["b", "z"]])

    我不希望这是一个“为我解决这个问题”的问题,但我很难表达我真正需要帮助的是什么。

    N、 B.我还是 尝试 所以这绝对是一个熟悉度问题。

    1 回复  |  直到 7 年前
        1
  •  3
  •   davidchambers    7 年前

    我们可以利用 S.map S.join 要移除不需要的嵌套:

    const S = require ('sanctuary');
    const $ = require ('sanctuary-def');
    
    //    getTag :: String -> Object -> Maybe String
    const getTag = tag => S.pipe ([
      S.get (S.is ($.String)) ('Tags'),             // :: Maybe String
      S.map (S.splitOn (',')),                      // :: Maybe (Array String)
      S.map (S.map (S.stripPrefix (tag + '='))),    // :: Maybe (Array (Maybe String))
      S.map (S.head),                               // :: Maybe (Maybe (Maybe String))
      S.join,                                       // :: Maybe (Maybe String)
      S.join,                                       // :: Maybe String
    ]);
    
    getTag ('a') ({Tags: 'a=y,b=z'});   // => Just ('y')
    getTag ('z') ({Tags: 'a=y,b=z'});   // => Nothing
    getTag ('z') ({Tags: null});        // => Nothing
    

    然后 S、 加入 总是等同于 S.chain

    //    getTag :: String -> Object -> Maybe String
    const getTag = tag => S.pipe ([
      S.get (S.is ($.String)) ('Tags'),             // :: Maybe String
      S.map (S.splitOn (',')),                      // :: Maybe (Array String)
      S.map (S.map (S.stripPrefix (tag + '='))),    // :: Maybe (Array (Maybe String))
      S.chain (S.head),                             // :: Maybe (Maybe String)
      S.join,                                       // :: Maybe String
    ]);
    

    这种方法不是通过短路来做一些不必要的工作,但是 S.stripPrefix

    使用的更新版本 S.justs 要选择第一个匹配项:

    //    getTag :: String -> Object -> Maybe String
    const getTag = tag => S.pipe ([
      S.get (S.is ($.String)) ('Tags'),             // :: Maybe String
      S.map (S.splitOn (',')),                      // :: Maybe (Array String)
      S.map (S.map (S.stripPrefix (tag + '='))),    // :: Maybe (Array (Maybe String))
      S.map (S.justs),                              // :: Maybe (Array String)
      S.chain (S.head),                             // :: Maybe String
    ]);
    
        2
  •  0
  •   lukas    5 年前

    这里有一个替代仅使用现代JavaScript的保护区代码的方法:

    const stripPrefix = e =>
        e.startsWith(`${tag}=`)
            && e.replace(`${tag}=`, "")
    
    const getTag = tag => product =>
        product?.Tags
            ?.split(",")
            .map(stripPrefix)
            .filter(Boolean)
            [0]
        || null
    
    
    getTag("b")({ Tags: "a=y,b=c" }) // returns 'y'
    getTag("z")({ Tags: "a=y,b=z" }) // returns null
    getTag("a")({ Tags: null }) // returns null
    

    stripPrefix 函数返回 false 如果找不到标记,则 filter 预计起飞时间。

    你可以应付 { Tags: null } optional chaining 操作员( ?. ).

    推荐文章