使用Ramda或vanillaJS将任意深度嵌套的值转换为对象键

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

我正在使用一个以非常规方式返回一系列值的库。库不是返回数组,而是返回嵌套的对象,其中包含最终的叶子节点作为值。例如:

red.walk.fast.true变为{red: {walk: {fast: 'true'}}}要么climbing.ascending变为{climbing: 'ascending'}

嵌套对象的格式实际上适合我的用例,但是我需要一种将最终值转换为另一个嵌套对象(具有空值-但这并不重要)而不是值的方法。因此:

[{red: {walk: {fast: 'true'}}}变为{red: {walk: {fast: {true: null}}}}

该公式需要用于任意深度嵌套的对象。我正在努力获得与Ramda一起使用的递归函数。我认为以下方法会起作用:

const stringPropToObject = R.ifElse(
    R.is(String),
    R.assoc(R.__, null, {}),
    mapAllStringPropsToObjs);

const mapAllStringPropsToObjs = R.map(stringPropToObject)

const updatedObject = mapAllStringPropsToObjs({ a: { b: { c: 'd' } } })

console.log(updatedObject);

mapAllStringPropsToObjs(尝试)以映射对象属性,并将它们传递给stringPropToObject。然后,它查看传入的属性。

  • 如果是字符串,则返回一个具有以下属性的新对象:该字符串名称。
  • 如果是对象,则(应)递归调用mapAllStringPropsToObjs传递对象,直到String值为点击。
  • 这将导致“初始化前无法访问'mapAllStringPropsToObjs'”。我知道为什么现在的声明顺序会出现此错误,但是我看不到如何命令它们来避免它-它们是相互依赖的函数。

任何人都知道我可以使用Ramda或vanilla JS进行转换:{climbing: 'ascending'}变成{climbing: {ascending: null}}{red: {walk: {fast: 'true'}}}转换为{red: {walk: {fast: {true: null}}}}或任何其他任意嵌套的值。

谢谢您的任何建议。

我正在使用一个以非常规方式返回一系列值的库。库不是返回数组,而是返回嵌套的对象,其中包含最终的叶子节点作为值。 ...

javascript object nested mapping ramda.js
1个回答
0
投票

您可以迭代条目,如果没有对象,则分配一个新的条目。

© www.soinside.com 2019 - 2024. All rights reserved.