[英]Rename keys with ramda js
const orignalArr = [
{
personName: 'Joe'
}
]
预期输出:
const convertedArr = [
{
name: 'Joe'
}
]
我认为重命名的键是在一个对象中定义的(但如果有更好的映射方法就可以了):
const keymaps = {
personName: 'name'
};
我怎样才能用 Ramda 做到这一点?
R.map
东西
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},
{}
)
您可以将 Ramda 与Ramda Adjunct结合使用。 使用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' }]
希望对你有帮助:)
这是我对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 调用。 它是最短的之一,如果不是最短的;)
首先,根据你的例子
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
。
我的想法是首先检查我要重命名的旧道具是否存在,而我要创建的新键是否存在。
然后,我将使用S_
公共组合器使其无点。
在此处查找 JS 常用组合器
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’ }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.