[英]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)
);
另一种替代方法既evolve
和assoc
是调查的各种lens
在Ramda -相关的功能,如lensProp
, over
,和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.