ramda根据原始值更新对象值

时间:2018-06-26 01:10:13

标签: ramda.js

我想用前缀path更新对象中的http://127.0.0.1
我应该在Ramda中使用哪种方法?

  const data = [
    { id: 1, path: '/abc/1.jpg' },
    { id: 2, path: '/abc/2.jpg' },
    { id: 3, path: '/abc/1.jpg' },
  ];

  // ES6 way
  const R1 = data.map(item => {
    return {
      ...item,
      path: `http://127.0.0.1${item.path}`
    }
  });

我尝试使用R.assoc替换值。
但是我不知道如何获取原始路径值
请引导我。

  // Ramda way ??
  const R2 = R.map(
    R.assoc('path', 'http://127.0.0.1'), 
    data
  )

1 个答案:

答案 0 :(得分:2)

我可以想到两种非常简单的方法来实现这一点。还有很多不是没有重点的。

第一个看起来像这样:

const {map, over, lensProp, concat} = R

const transform = map(over(lensProp('path'), concat('http://127.0.0.1')))


const data = [{"id": 1, "path": "/abc/1.jpg"},
              {"id": 2, "path": "/abc/2.jpg"}, 
              {"id": 3, "path": "/abc/1.jpg"}]
console.log(transform(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

第二个看起来像这样:

const {map, evolve, concat} = R

const transform = map(evolve({path: concat('http://127.0.0.1')}))

const data = [{"id": 1, "path": "/abc/1.jpg"}, 
              {"id": 2, "path": "/abc/2.jpg"}, 
              {"id": 3, "path": "/abc/1.jpg"}]
console.log(transform(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

第一种方法使用更多标准的FP工具:镜头。来自其他语言或图书馆的人会更容易识别它。

第二种方法的优点是,当数据不完全是您想要的时,它会更健壮。而且,如果您想添加其他转换,则不会有链式调用,只有规范中传递给evolve的其他元素。

当然,如果您想放弃无积分,您可以使用

const transform = map(item => assoc('path', 'http://123.0.0.1' + item.path, item))