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

时间:2017-06-08 14:39:55

标签: javascript ramda.js

我有一个集合,我想从中获取一些值,并将它们合并在一起形成一个新值。到目前为止,我已经查看了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)

1 个答案:

答案 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)
);

evolveassoc的另一种替代方法是调查Ramda中与lens相关的各种函数,例如lensPropover和{ {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;。)