我有一个集合,我想从中获取一些值,并将它们合并在一起形成一个新值。到目前为止,我已经查看了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)
答案 0 :(得分:2)
所以问题是你需要的数据不在范围内。在我看来,最简单的方法是添加一些范围!
首先,您不需要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
的另一种替代方法是调查Ramda中与lens
相关的各种函数,例如lensProp
,over
和{ {3}}
现在,如果这些辅助函数仅用于此目的,您可能不希望它们混乱,您可以选择在主函数中内联它们。如果您喜欢,可以将以上所有内容合并到
中const addUrls = map(
image => evolve({
medias: map(medium => assoc('image_url', image.permalink + '/' + medium.filename, medium)),
}, image)
);
您可以在Ramda REPL中看到 set
方法或 separate functions 。为了更好地衡量,还有一个 combined one 。
(另外一点,"媒体"已经是复数。单数是"媒体"。没有充分的理由" medias& #34;。)