gpt4 book ai didi

javascript - Ramda : How to change only one value of an object, 基于对象的其他值

转载 作者:行者123 更新时间:2023-11-28 12:13:21 24 4
gpt4 key购买 nike

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

如果你想看完整的代码,我也在 StackExchange Code Review 上寻求帮助。 .

不过,对于 Stack Overflow,只有一部分是相关的。

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

上下文:我有一个代表联系人的对象,其中有几个键,这些键都是字符串。该对象始终有一个名为 contactDetails 的键。我想根据对象的 telbdayemail 键的值来计算 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
),

正如你所看到的,这是一种非常不干净和黑客的滥用map的方式。有没有更好的方法可以根据对象的其他值更改 Ramda 中对象的值?

最佳答案

除非这是学习 Ramda 的练习,否则我建议比您可能从 Ramda 中想到的任何技术更简单的技术是直接的对象解构方法:

const transform = ({tel, bday, email, ...rest}) => ({
...rest, tel, bday, email,
contactDetails: [bday, email, tel].join(' ').trim()
})

const obj = {firstName: 'John', lastName: 'Doe', tel: '555-55-5555', bday: '', email: 'john@doe.com'}

console.log(transform(obj))

此版本不依赖于已存在的 key contactDetails,尽管它存在也不会造成影响。

如果您确实担心单词之间可能存在双空格(例如,如果提供了 bdaytel,但提供了 email 为空),可以修改为:

const combine = (ss) => ss.reduce((a, s) => a + (s.length ? ' ' : '') + s, '').trim()

const transform = ({tel, bday, email, ...rest}) => ({
...rest, tel, bday, email,
contactDetails: combine([bday, email, tel])
})

我是 Ramda 的创始人之一,也是它的忠实粉丝,但它只是一个工具包。有很多地方它可以帮助你的代码更容易阅读和编写;那么无论如何都要使用它。但是,如果它不这样做,即使在大量使用 Ramda 的代码库中,也可以跳过它并使用其他技术。

关于javascript - Ramda : How to change only one value of an object, 基于对象的其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55845099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com