ramda 根据原始值更新对象值

ramda update object value base on original value

我想更新前缀为 http://127.0.0.1
的对象中的 path 我应该在 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
  )

我可以想到两种相当简单的方法来做到这一点。也有很多不是无积分的。

第一个看起来像这样:

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))