使用 ramda js 重命名键

Rename keys with ramda js

const orignalArr = [
  {
    personName: 'Joe'
  }
]

预期输出:

const convertedArr = [
  {
    name: 'Joe'
  }
]

我认为重命名的键是在一个对象中定义的(但如果有更好的方法来映射它们就没问题):

const keymaps = {
  personName: 'name'
};

我如何使用 Ramda 执行此操作?

R.map

这里有an entry in Ramda's Cookbook

const renameKeys = R.curry((keysMap, obj) =>
  R.reduce((acc, key) => R.assoc(keysMap[key] || key, obj[key], acc), {}, R.keys(obj))
);

const originalArr = [{personName: 'Joe'}]

console .log (
  R.map (renameKeys ({personName: 'name'}), originalArr)
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

但是随着ES6的普及,直接这样写还是很容易的:

const renameKeys = (keysMap) => (obj) => Object.entries(obj).reduce(
  (a, [k, v]) => k in keysMap ? {...a, [keysMap[k]]: v} : {...a, [k]: v},
  {}
)

这是我对 renameKeys 的看法。主要思想是将键和值分离到两个数组中。映射键数组,并替换为 keyMap 中的值(如果存在),然后压缩回对象:

const { pipe, toPairs, transpose, converge, zipObj, head, map, last } = R

const renameKeys = keysMap => pipe(
  toPairs, // convert to entries
  transpose, // convert to array of keys, and array of values
  converge(zipObj, [ // zip back to object
    pipe(head, map(key => keysMap[key] || key)), // rename the keys
    last // get the values
  ])
)
  


const originalArr = [{ personName: 'Joe', lastName: 'greg' }]

const result = R.map(renameKeys({ personName: 'name' }), originalArr)

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

你可以结合 Ramda 和 Ramda Adjunct. Using the renameKeys (https://char0n.github.io/ramda-adjunct/2.27.0/RA.html#.renameKeys) 方法非常有用。有了它你可以简单地做这样的事情:

const people = [
  {
    personName: 'Joe'
  }
]

const renameKeys = R.map(RA.renameKeys({ personName: 'name' }));

const __people__ = renameKeys(people);

console.log(__people__) // [ { name: 'Joe' }]

希望对你有所帮助:)

我的想法是首先检查我要重命名的旧道具是否存在,而我要创建的新密钥不存在。

然后,我将使用 S_ 公共组合器使其成为无点。

查找 JS 公共组合器here


const { 
    allPass, assoc, compose: B, complement, has, omit, prop, when
} = require('ramda');

const S_ = (f) => (g) => (x) => f (g (x)) (x);

const renameKey = (newKey) => (oldKey) => when(allPass([
    has(oldKey)
    , complement(has)(newKey)
]))
(B(omit([oldKey]), S_(assoc(newKey))(prop(oldKey))))
    
const obj = { fullname: 'Jon' };

renameKey('name')('fullname')(obj) // => { name: ‘Jon’ }

这是我自己的解决方案,没有太多箭头函数(只有一个),主要是纯 Ramda 调用。它是最短的之一,如果不是最短的话;)

首先,根据你的例子

const { apply, compose, either, flip, identity, map, mergeAll, objOf, prop, replace, toPairs, useWith } = require('ramda');             

const RenameKeys = f => compose(mergeAll, map(apply(useWith(objOf, [f]))), toPairs);

const originalArr = [
    {
        personName: 'Joe',
    },
];

const keymaps = {
    personName: 'name',
};

// const HowToRename = flip(prop)(keymaps); // if you don't have keys not specified in keymaps explicitly
const HowToRename = either(flip(prop)(keymaps), identity);

console.log(map(RenameKeys(HowToRename))(originalArr));

第二个选项,使用带有重命名规则的任意 lambda:

const { apply, compose, map, mergeAll, objOf, replace, toPairs, useWith } = require('ramda');

const RenameKeys = f => compose(mergeAll, map(apply(useWith(objOf, [f]))), toPairs);

const HowToRename = replace(/(?<=.)(?!$)/g, '_'); // for example

console.log(RenameKeys(HowToRename)({ one: 1, two: 2, three: 3 }));

产量

{ o_n_e: 1, t_w_o: 2, t_h_r_e_e: 3 }

第三,您可以使用第一个示例中的基于对象的重命名规则并使用回退策略,例如replace 就像第二个例子,而不是 identity.