如何在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 ?
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