Javascript Ramda:如何根据对象的其他值仅更改对象的一个值

Javascript Ramda:如何根据对象的其他值仅更改对象的一个值,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我正在构建一个React应用程序。我正在使用Ramda来帮助我进行函数式编程 如果你想看到完整的代码,我也要求帮助 不过,对于堆栈溢出,只有一个部分是相关的 如何使用Ramda基于对象的其他值更改对象的特定值?我使用mapObjIndexed,它在过程中映射所有键 上下文:我有一个对象,它表示一个带有多个键的触点,这些键都是字符串。对象始终有一个名为contactDetails的键。我想根据对象的tel、bday和email键的值计算contactDetails的值 如果某个联系人在功能开始前看

我正在构建一个React应用程序。我正在使用Ramda来帮助我进行函数式编程

如果你想看到完整的代码,我也要求帮助

不过,对于堆栈溢出,只有一个部分是相关的

如何使用Ramda基于对象的其他值更改对象的特定值?我使用mapObjIndexed,它在过程中映射所有键

上下文:我有一个对象,它表示一个带有多个键的触点,这些键都是字符串。对象始终有一个名为contactDetails的键。我想根据对象的tel、bday和email键的值计算contactDetails的值

如果某个联系人在功能开始前看起来像这样:

{
  firstName: 'John',
  lastName: 'Doe',
  contactDetails: '',
  tel: '555-55-5555',
  bday: '',
  email: 'john@doe.com'
}
之后应该是这样的:

{
  firstName: 'John',
  lastName: 'Doe',
  contactDetails: 'john@doe.com 555-55-5555',
  tel: '555-55-5555',
  bday: '',
  email: 'john@doe.com'
}
我为此编写的函数如下所示:

R.mapObjIndexed((val, key, obj) =>
  key === 'contactDetails'
    ? R.trim(
        R.replace(
          /undefined/g,
          '',
          `${R.prop('bday')(obj)} ${R.prop('tel')(obj)} ${R.prop('email')(
            obj
          )}`
        )
      )
    : val
),

正如你们所看到的,这是一个相当不干净和黑客滥用地图的方式。有没有更好的方法可以基于对象的其他值在Ramda中更改对象的值?

您可以使用R.converge合并原始对象和生成contactDetails属性的R.pipe的结果。管道通过R.props获取一个值数组,过滤掉未定义的假值、空字符串、空值等,用空格连接项,并用R.objOf将值包装为对象

const{converge,merge,identity,pipe,props,filter,join,trim,objOf}=R const fn=convergemerge,[identity,pipe 道具['b日期','电话','电子邮件'], 过滤池, 加入“”, objOf“联系人详细信息” ] 常量对象={ 名字:“约翰”, 姓氏:“Doe”, 联系方式:, 电话:555-55-5555, B日期:, 电邮:'john@doe.com' } 常数结果=fnobj console.logresult
除非这是一个学习Ramda的练习,否则我会建议一个比你可能从Ramda中得到的任何东西都更简单的技术是直接的对象分解方法:

const transform={tel,bday,email,…rest}=>{ …休息、电话、B日、电子邮件、, contactDetails:[b日期、电子邮件、电话].加入'' } const obj={firstName:'John',lastName:'Doe',电话:'555-55-5555',日期:,电子邮件:'john@doe.com'}
console.logtransformobj作为Ori答案的替代方法,我们可以使用R.assoc'contactDetails更新属性,使用R.juxt和R.propo构建所需属性值的列表,以默认任何缺少的属性,在将它们与R.join连接在一起之前拒绝任何空字符串

//获取属性名列表,返回接受对象的函数 //并生成所提供属性的值列表,默认为 //如果为null或未定义,则为空字符串。 常数defProps= R.composeR.juxt,R.mapR.propOr 常数fn= //当'g'是一个函数时,'R.chainf,gx'相当于'fgx,x'` R.链 R.assoc“联系人详细信息”, 右管 defProps['bday','tel','email'], R.R.equals, 加入“ console.logfn{ 名字:“约翰”, 姓氏:“Doe”, 联系方式:, 电话:555-55-5555, B日期:, 电邮:'john@doe.com' }
一如既往地谢谢你,斯科特。我喜欢你回答几乎每一个标有拉姆达的问题。它真的帮助人们学习