使用Ramda将点分隔的键/值对展开为嵌套对象

时间:2017-10-11 16:51:21

标签: javascript ramda.js

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

3 个答案:

答案 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;
&#13;
&#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>