通过使用 Ramda 将 Value 中的字段附加到 Key 来修改对象的 Key

Modify Key of the object by appending a field from Value into Key using Ramda

我正在尝试将 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"  
   }
}

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

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

谢谢

我觉得评论里的人大部分都是对的。 (免责声明:我是 Ramda 的作者之一。)

假设 Ramda 有一个 renameBy 函数:

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

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

这对您有多大帮助?

然后您可以编写一个转换函数,例如

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

当然,现在比

中的简单

但此处保留了该版本的基本复杂部分:对键和值执行字符串插值以生成新键的函数。任何使该点免费的尝试都可能比这个版本更难看。

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

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

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

您可以在 Ramda REPL.

中看到此版本