繁体   English   中英

合并对象的字段以使用Ramda创建新字段

[英]Merge fields of object to create new field with Ramda

我有一个我想从中获取一些值并将它们合并在一起以形成新值的集合。 到目前为止,我已经看过R.evolve ,但是没有运气(因为medias也是一个集合。

这就是我的开始:

[{
  "permalink": "http://example.com/1",
  "medias": [{
    "filename": "image_1.png",
  }]
}, {
  "permalink": "http://example.com/3",
  "medias": [{
    "filename": "image_3.png",
  }]
}]

这就是我想要结束的:

[{
  "permalink": "http://example.com/1",
  "medias": [{
    "filename": "image_1.png",
    "image_url": "http://example.com/1/image_1.png"
  }]
}, {
  "permalink": "http://example.com/3",
  "medias": [{
    "filename": "image_3.png",
    "image_url": "http://example.com/3/image_3.png"
  }]
}]

本质上,我们正在做的是在每个filename前添加一个permalink

到目前为止,这是我一直在做的事情,不幸的是,在medias上运行转换时,我无法访问permalink属性。

const mapMedia = R.map(
  // can’t get access to the `permalink` in here?
)

const transformations = {
  medias: mapMedia
}

const transform = R.compose(
  R.map(R.evolve(transformations)),
)(data)

因此,问题在于所需的数据不在范围内。 我认为,最简单的解决方法是增加范围!

首先,您不需要进行compose调用,因为您只提供了一个功能。 所以我们可以更换

const transform = R.compose(
  R.map(R.evolve(transformations)),
)(data)

只是

const transform = R.map(R.evolve(transformations)),

(我也删除了(data)的调用,因为我试图将其构建为可重用的函数。我们稍后将使用transform(data)对其进行调用。

现在,我们必须添加上下文,以便transformations将对象包含在范围内。 我们可以这样做:

const transform = R.map(image => R.evolve(transformations(image), image));

当然,这意味着transformations需要改变,以考虑到这一点。 我们可以这样做:

const transformations = image => ({
  medias: mapMedia(image.permalink)
})

...而这又需要更改mapMedia 我认为它只需要知道永久链接,而不是整个图像,因此我们只能通过上述方式。 现在, mapMedia将如下所示:

const mapMedia = permalink => R.map(
  medium => // do something with `medium` and `permalink`
);

您可以通过很多方法来完成此最后一步。 其中之一与您对evolve的使用非常一致:

const mapMedia = permalink => R.map(
  medium => assoc('image_url', permalink + '/' + medium.filename, medium)
);

另一种替代方法既evolveassoc是调查的各种lens在Ramda -相关的功能,如lensPropover ,和set

现在,如果这些辅助功能仅用于此目的,您可能不希望它们使事情变得混乱,您可以选择将它们内联到您的主要功能中。 如果愿意,可以将以上所有内容合并为

const addUrls = map(
  image => evolve({
    medias: map(medium => assoc('image_url', image.permalink + '/' + medium.filename, medium)),
  }, image)
);

您可以在Ramda REPL中看到单独的功能方法或组合的方法。 出于良好的考虑,还有使用镜片版本


(另外,“媒体”一词已经是复数形式。单数是“中”。“媒体”没有充分的理由。)

暂无
暂无

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

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