![](/img/trans.png)
[英]How can I find the full dot-separated key when searching a nested object via the value?
[英]Unflatten a dot-separated key/value pair into a nested object using Ramda
Ramda食谱在此说明了如何将嵌套对象转换为点分隔的展平对象。 我是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的工作小提琴在这里 。
这可以通过以下方法来实现:使用R.toPairs
将对象拆分为对,然后通过拆分每个对象上的键将每个对象对“ R.toPairs
”为一个对象.
进入列表,并将其作为R.assocPath
的路径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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.