【问题标题】:Modify Key of the object by appending a field from Value into Key using Ramda通过使用 Ramda 将 Value 中的字段附加到 Key 来修改对象的 Key
【发布时间】:2017-04-23 20:38:46
【问题描述】:

我正在尝试将Ramda 应用于以下问题:-

{
   "alpha": {
      "reg": "alpha1",
      "reg2": "alpha2"
   },
   "beta": {
      "reg": "beta1",
      "reg2": "beta2"  
   }
}

输出

{
   "v:alpha|reg:alpha1": {
      "reg": "alpha1",
      "reg2": "alpha2"
   },
   "v:beta|reg:beta1": {
      "reg": "beta1",
      "reg2": "beta2"  
   }
}

基本上,输出将是通过将键和值中的字段组合成键并形成新键来修改键的对象。

例如如果 key="alpha",value 是 key reg="alpha1" 的对象。所以密钥应该修改为v:alpha|reg:alpha1。 v 是附加在每个键开头的唯一字符串,然后将 reg:alpha1 附加到键。

谢谢

【问题讨论】:

  • "v:beta|reg:alpha2" --- 添加|字符后面的部分的逻辑是什么?
  • @zerkms 每个值都有带值的“reg”字段。我还需要将其附加到带有字段名称的键中。基本上,对象保持不变,键被转换。
  • 那为什么是v:beta|reg:alpha2 而不是v:beta|reg:beta1
  • @zerkms 这是要求。
  • @rgeek 我建议您在担心您还不了解的事情之前先了解一下 fp 基础知识。如果您不知道自己所做的权衡,您将永远无法欣赏它们

标签: javascript functional-programming ramda.js


【解决方案1】:

我认为人们在 cmets 中所说的话大多是正确的。 (免责声明:我是 Ramda 的作者之一。)

假设 Ramda 有一个renameBy 函数:

const renameBy = curry((fn, obj) => pipe(
  toPairs,
  map(pair => [apply(fn, pair), pair[1]]),
  fromPairs
)(obj))

Ramda 现在不包含这个,但是在 Ramda 的 Cookbook 中有一个 slightly less powerful version。当然可以想象有一天它会被包括在内。但如果做不到这一点,您可以在自己的代码库中包含这样的功能。 (如果我们真的尝试过,我们可能会不加分,但正如我试图解释的那样,这可能是不必要的。)

这对你有多大好处?

然后你可以写一个像这样的转换函数

const transform = renameBy((k, v) => `v:${k}|reg:${v.reg}`);

当然,这比 zerkms's comment 中的更简单

但是这里保留了该版本的基本复杂部分:对您的键和值执行字符串插值以产生新键的函数。任何使该版本不加分的尝试都可能比这个版本更难看。

也许这对你来说是值得的。它确实将重命名密钥的操作与您的特定密钥生成方案之间的关注点分开。它还降低了视觉复杂性……但前提是您将 renameBy 移到某些实用程序库中。如果您打算多次使用 renameBy,或者如果您只是希望构建一个更完整的实用程序库以使您的其他代码更加专注,那么这可能是一种合理的方法。

但这并没有降低代码的本质复杂性。

在合理的情况下,我确实会寻求免积分的解决方案。但它们只是我工具箱中的另一个工具。只有使代码更具可读性和可维护性,它们才值得。如果它们增加了复杂性,我建议您不要打扰。

你可以在Ramda REPL看到这个版本。

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2018-06-30
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多