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

标签 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”的对象。因此 key 应修改为v:alpha|reg:a​​lpha1。 v 是附加在每个键开头的唯一字符串,然后将 reg:a​​lpha1 附加到该键。

谢谢

最佳答案

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

假设 Ramda 有一个 renameBy 函数:

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

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

这对你有多大好处?

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

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

当然,现在比 zerkms's comment 中的简单。

但是该版本的基本复杂部分保留在这里:对键和值执行字符串插值以生成新键的函数。任何试图使其无积分的尝试都可能比这个版本丑陋得多。

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

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

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

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

关于javascript - 通过使用 Ramda 将 Value 中的字段附加到 Key 中来修改对象的 Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43567389/

相关文章:

javascript - 有关 JQuery 的 .html() 方法的详细信息

javascript - 给定数组提取对象值的功能方法

javascript - Ramda 减少字符串来替换前一个

javascript - 如何使用 ramda 按数组对象中的最后一项进行排序

javascript - 使用 Ramda 执行子数组的函数式方法

JavaScript:克隆一个函数

javascript - 使用 ng-class-even/odd 添加颜色

javascript - JQuery - 将 JS 转换为 JQuery 以生成允许解析 URL 参数的表

list - Scheme 中 even 的和

python - 如何使用python itertools模块