繁体   English   中英

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

[英]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"  
   }
}

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

例如,如果key =“ alpha”,则值为带有键reg =“ alpha1”的对象。 因此应将密钥修改为v:alpha|reg:alpha1 v是唯一的字符串,附加在每个键的开头,然后将reg:alpha1附加到键。

谢谢

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

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

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

Ramda现在不包括此功能,但Ramda的Cookbook中的 功能稍差一些 当然可以考虑将其中的某天包括在内。 否则,您可以在自己的代码库中包含这样的功能。 (如果我们真的尝试过,我们可能可以使该点没有问题,但是正如我试图解释的那样,这可能是不必要的。)

这能使您受益多少?

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

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

当然,这现在比zerkms的评论要简单

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

也许这对您来说值得。 它在重命名密钥的操作和您特定的密钥生成方案之间确实分开了关注点。 而且它降低了视觉上的复杂性……但是仅当您将重renameBy移到某些实用程序库中renameBy可见。 如果您将要使用renameBy多种用法,或者只是为了建立更多完整的实用程序库以使您的其他代码更加集中renameBy ,那么这可能是一种合理的方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM