Ramda食谱解释了here如何将嵌套对象转换为点分隔的扁平对象。 我是Ramda的新手,我想学习如何做到与上述相反。
它将转换此对象:
{
"company.name": "Name is required",
"solarSystemInfo.name": "Name is required",
"installer.business.name": "slkdfj is required"
}
要,
{
"company": {
"name": "Name is required"
},
"solarSystemInfo": {
"name": "Name is required"
},
"installer": {
"business": {
"name": "slkdfj is requried"
}
}
}
使用普通JS的工作小提琴是here。
答案 0 :(得分:4)
这可以通过使用R.toPairs
将对象分成对,然后" unflattening"来实现。通过将每个.
上的密钥拆分成一个列表并将其作为路径传递给R.assocPath
来构建对象,将每个对分成一个对象。这将生成一个对象列表,然后可以使用R.mergeAll
合并在一起。
const data = {
"company.name": "Name is required",
"solarSystemInfo.name": "Name is required",
"installer.business.name": "slkdfj is required"
}
const pathPairToObj = (key, val) =>
R.assocPath(R.split('.', key), val, {})
const unflattenObj = R.pipe(
R.toPairs,
R.map(R.apply(pathPairToObj)),
R.mergeAll
)
console.log(unflattenObj(data))

<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
&#13;
答案 1 :(得分:1)
使用Reduce可以避免使用多个键覆盖对象。
const data = {
"company.name": "Name is required",
"solarSystemInfo.name": "Name is required",
"installer.business.name": "Reg. name is required",
"installer.business.code": "NYSE code is required"
}
const buildObj = (acc,value) => {
[key,val]=value;
return R.assocPath(R.split('.', key), val, acc);
}
const unflattenObj = R.pipe(
R.toPairs,
R.reduce(buildObj,{})
);
console.log(unflattenObj(data));
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
答案 2 :(得分:0)
从“使用Reduce可以避免使用多个键覆盖对象”。
如果您在Typescript项目上并且具有“找不到键”或“ val” ...,则可以使用:
const data = {
"company.name": "Name is required",
"solarSystemInfo.name": "Name is required",
"installer.business.name": "Reg. name is required",
"installer.business.code": "NYSE code is required"
}
const buildObj = (acc, value) => {
const [key,val] = value
return R.assocPath(R.split('.', key), val, acc);
}
const unflattenObj = R.pipe(
R.toPairs,
R.reduce(buildObj,{})
)
console.log(unflattenObj(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>