javascript - 使用 Ramda 向 JSONobject 添加新的嵌套条目
问题描述
有一个我们应该添加 json 数据的初始空对象。使用 lodash 可以按如下方式添加它。
const _ = require('lodash');
data = {};
_.set(data, 'client.firstName', incomingData.firstName ? incomingData.firstName : '');
_.set(data, 'client.lastName', incomingData.lastName ? incomingData.lastName : '');
_.set(data, 'client.middleInitial', incomingData.middleInitial ? incomingData.middleInitial : '');
_.set(data, 'maidenName', incomingData.maidenName ? incomingData.maidenName : '');
...
现在应该使用rambda做同样的实现。通过引用 ramda 文档进行了尝试,但无法找到一个精确的解决方案,以便像这样接收输出:
{
"client":
{
"firstName":"Pete",
"lastName":"Cathy",
"middleInitial":"M"
},
"maidenName":"catty"
...
...
}
请建议我实现相同的正确实施。
解决方案
使用 Ramda,您可以R.applySpec
通过提供包含生成每个属性的函数的规范来从另一个对象创建新对象。在您的情况下,使用R.propOr
从原始对象中获取数据,并提供一个空字符串作为后备:
const { applySpec, propOr } = R;
const getData = applySpec({
client: {
firstName: propOr('', 'firstName'),
lastName: propOr('', 'lastName'),
middleInitial: propOr('', 'middleInitial')
},
maidenName: propOr('', 'maidenName')
});
const incomingData = {
firstName: 'Pete',
lastName: 'Cathy',
maidenName: 'Catty',
};
const data = getData(incomingData);
console.log(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
Rambda的工作方式相同,但至少 UMD 似乎有一个错误。如果R.propOr
提供给所有属性,则函数返回一个空对象。如果您遇到错误,propOr
请使用函数将调用之一包装为 hack 以使其工作。
const { applySpec, propOr } = R;
const getData = applySpec({
client: {
firstName: x => propOr('', 'firstName', x), // <- stupid hack
lastName: propOr('', 'lastName'),
middleInitial: propOr('', 'middleInitial')
},
maidenName: propOr('', 'maidenName')
});
const incomingData = {
firstName: 'Pete',
lastName: 'Cathy',
maidenName: 'Catty',
};
const data = getData(incomingData);
console.log(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rambda/6.9.0/rambda.umd.js" integrity="sha512-1npVFfj/soXclDC0ts7zenNSKArClG4bNYSpOLuE5ojVI7mXLLdkoRvXGejgOS1p/zORDKajYMxXw/Ia6vNulQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
推荐阅读
- wordpress - Wordpress echo site_url() - 为什么使用 echo?
- c# - Asp.net Core 2 验证所有依赖项都已注册
- facebook-graph-api - 检查用户是否存在于 Facebook
- docker - .dockerignore 不用于 docker-compose 构建?
- concurrency - Spring data JPA - 实体的并发访问
- php - 带有连接表的 Doctrine 查询生成器 ManyToMany
- scala - 在scala中使用嵌套foreach进行迭代是否有效?
- android - 更新到新的 Android Studio 3.1.2
- recursion - Scheme中的中间递归函数值
- java - 如果 DatePicker 在 AlertDialog 内,则不会在 EditText 单击上显示