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

时间:2017-04-23 04:29:15

标签: javascript functional-programming ramda.js

我正在尝试对以下问题应用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"的对象。所以密钥应修改为v:alpha|reg:alpha1。 v是在每个键的开头附加的唯一字符串,然后将reg:alpha1附加到键上。

由于

1 个答案:

答案 0 :(得分:3)

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

让我们想象一下Ramda有一个renameBy函数:

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

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

这会让你获得多少收益?

然后你可以写一个像

这样的转换函数
const transform = renameBy((k, v) => `v:${k}|reg:${v.reg}`);

当然,现在比zerkms's comment

中的那个更简单

但是这个版本的基本复杂位在这里保留:对你的键执行字符串插值的函数和产生新键的值。任何使这一点免费的尝试都可能比这个版本更加丑陋。

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

但它并没有减少代码的基本复杂性。

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

您可以在 Ramda REPL

中看到此版本