使用 ramda.js 替换键的值

Replace value of key using ramda.js

我有以下对象数组:

const originalArray = [
  {name: 'name1', value: 10},
  {name: 'name2', value: 20}
]

以及以下对象

names = {
  name1: 'generic_name_1',
  name2: 'generic_name_2'
}

我希望第一个数组像这样转换:

[
  {name: 'generic_name_1', value: 10},
  {name: 'generic_name_2', value: 20}
]

到目前为止我尝试了什么:

const replaceName = (names, obj) => {
  if(obj['name'] in names){
    obj['name'] = names[obj['name']];
  }
  return obj;
}
const modifiedArray = R.map(replaceName(names), originalArray)

是否有更像 ramda 的方法来做到这一点?

在 Ramda 函数中使用本机 JS 并非无礼。您的代码中唯一的问题是您改变了原始对象 - obj['name'] = names[obj['name']];.

我会使用 R.when 来检查该名称是否存在于 names 对象中,以及它是否确实将对象演变为新名称。如果不是,将返回原始对象。

const { flip, has, prop, map, when, pipe, evolve } = R

const hasProp = flip(has)
const getProp = flip(prop)

const fn = names => map(when(
  pipe(prop('name'), hasProp(names)),
  evolve({
    name: getProp(names)
  })
))

const originalArray = [{"name":"name1","value":10},{"name":"name2","value":20},{"name":"name3","value":30}]
const names = {"name1":"generic_name_1","name2":"generic_name_2"}

const result = fn(names)(originalArray)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>

我不会为此使用任何 Ramda 函数。我会简单地避免改变原始代码,也许使用这样的代码:

const transform = (names) => (arr) => arr .map (
  ({name, ... rest}) => ({name: names [name] || name, ... rest})
)

const originalArray = [{name: 'name1', value: 10},{name: 'name2', value: 20}]
const names = {name1: 'generic_name_1',name2: 'generic_name_2'}

console .log (
  transform (names) (originalArray)
)