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

问题描述 投票:0回答:3

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

javascript ramda.js
3个回答
4
投票

这可以通过使用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>

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>

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>
© www.soinside.com 2019 - 2024. All rights reserved.