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。
这可以通过使用R.toPairs
将对象分成对来实现,然后通过将每个.
上的键分成列表并将其作为路径传递给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>
使用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>
从“使用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>