javascript - 如何在对象中保留一些深层 Prop ?

如何在object中保留一些deep props?

以下是一个示例对象。

    const sample_object = {
      prop1: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: {properties: {type: 'real_value', unwantedProps1: {}, unwantedProps2: {}}}
            $ref: {},
          },
          unwantedAnotherSubProp1: {},
          ...
        },
        unwantedSubProp1: {},
        ...
      },
      unwantedProp1: {},
      prop2: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: {type: 'real_value'}},
            $ref: {},
          },
          unwantedAnotherSubProp1: {},
          ...
        },
        unwantedSubProp1: {},
        unwantedSubProp2: {},
        subprop2: {
          anothersubprop1: {
            properties: {realprop: {type: 'real_value'}},
            $ref: {},
          },
          anothersubprop2: {
            properties: {
              properties: {realprop: {type: 'real_value'}},
              $ref: {},
            },
            unwantedAnotherSubProp1: {},
            unwantedAnotherSubProp2: {},
            $ref: {},
          },
          ...
        },
        unwantedSubProp3: {},
        unwantedSubProp4: {},
        ...
      },
      unwantedProp2: {},
      prop3: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: {type: 'real_value'}},
            $ref: {},
          },
        },
        subprop2: {
          anothersubprop1: {
            properties: {},
            $ref: {},
          },
          unwantedAnotherSubProp1: {},
        },
        unwantedSubProp1: {},
        unwantedSubProp2: {},
        ...
      },
      unwantedProp3: {},
...
      properties: {realprop: {type: 'real_value'}},
      $ref: {},
    };

如何只保留下面的 props 而深深地移除所有其他 props?

            properties: {realprop: {type: 'real_value'}},
            $ref: {},


//注意上面两个不需要的 Prop 的子 Prop 也将被删除。

另请注意,我们需要替换上面两个必需的 Prop

properties: {realprop: {type: 'real_value'}}

进入:

properties: {realprop: 'real_value', name: 'Real Value', size: 10}

所以最终需要的 Prop 将有:

properties: {realprop: 'real_value', name: 'Real Value', size: 10},
$ref: {},

我们在这里添加了一个名为 name 的额外属性(这将是值“real_value”(来自 realprop:“real_value”)和大小(这将是所有常量)的句子形式。

下面是预期的结果:

 const expected_object = {
      prop1: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: 'real_value', name: 'Real Value'},
            $ref: {},
          },
          ...
        },
        ...
      },
      prop2: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: 'real_value', name: 'Real Value', size: 10},
            $ref: {},
          },
          ...
        },
        subprop2: {
          anothersubprop1: {
            properties: {realprop: 'real_value', name: 'Real Value', size: 10},
            $ref: {},
          },
          anothersubprop2: {
            properties: {
              properties: {realprop: 'real_value', name: 'Real Value', size: 10},
              $ref: {},
            },
            $ref: {},
          },
          ...
        },
        ...
      },
      prop3: {
        subprop1: {
          anothersubprop1: {
            properties: {realprop: 'real_value', name: 'Real Value', size: 10},
            $ref: {},
          },
        },
        subprop2: {
          anothersubprop1: {
            properties: {realprop: 'real_value', name: 'Real Value', size: 10},
            $ref: {},
          },
        },
        ...
      },
...
      properties: {realprop: 'real_value', name: 'Real Value', size: 10},
      $ref: {},
    };

如果 lodash 或任何其他类似的库是可能的,请建议 或任何自定义代码

更新:我做了一个小更新。也请考虑一下

最佳答案

lodash 函数集的例子

const removeUnwanted = (obj, props = [], funcs = {}) => {
   const res = {}
   const readProps = (currentObj, path = '') => {
      if (typeof currentObj !== 'object') return 
      for (const key in currentObj) {
         if (props.includes(key)) {
            let value = currentObj[key]
            if (funcs[key]) value = funcs[key](value)
            _.set(res, path + key, value)
         } else {
            readProps(currentObj[key], path + key + '.')
         }
      } 
   }

   readProps(obj)
   return res
}

const transformProperties = (prop) => {
   if (prop.realprop) return { 
      realprop: prop.realprop.type
      size: prop.realprop.type.length
   }
   return prop
}

removeUnwanted(obj, ['properties', 'ref'], { properires: transformProperties })

没有lodash set函数可以是这样的

function setByPath(obj, path, value) {
  let currentOnj = obj
  const parts = path.split('.')
  const key = parts.pop()
  parts.forEach(p => {
    if (!currentObj[p]) currentOnj[p] = {}
    currentObj = currentObj[p]
  })
  currentObj[key] = value
}

例子 https://codepen.io/dimoff66/pen/VwejYMy?editors=1112

https://stackoverflow.com/questions/62355627/

相关文章:

javascript - 匿名访问如何跟踪?智威汤逊/ cookies / session ?

html - Nodejs如何从ejs文件生成pdf文件

ruby-on-rails - 如何在 ruby​​ 中找到调用者类?

python-3.x - pynput pip3 安装错误 : Could not find a v

node.js - Node http.大文件传输失败并显示 'ERR_STREAM_PREMATU

javascript - react-router-dom 不工作只是渲染 "/"

flutter - 如何在 Flutter 的 initState 中获取当前的 App Local

c# - 使用 IIS 时出现多个错误

python - 如何在 Excel 的 Power Query 中运行 Python 脚本

python - `join` 或 `format` 字符串哪个更好?