首页 > 解决方案 > 使用 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"
...
...
}

请建议我实现相同的正确实施。

标签: javascriptangularramda.js

解决方案


使用 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>


推荐阅读