繁体   English   中英

使用 ramda js 重命名键

[英]Rename keys with ramda js

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

预期输出:

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

我认为重命名的键是在一个对象中定义的(但如果有更好的映射方法就可以了):

const keymaps = {
  personName: 'name'
};

我怎样才能用 Ramda 做到这一点?

R.map东西

Ramda 的 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},
  {}
)

您可以将 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM