我有一个大型的javascript对象,其中包含一个键的多个实例。我想从对象中删除此键和值的所有实例。
虽然我不确定如何修改它以获取所有对象以及从对象中删除键,但我具有此功能,它可以查找嵌套的对象。有人可以帮我吗?
var findObjectByKey= function (o, key) {
if (!o || (typeof o === 'string')) {
return null
}
if (o[key]) {
return o[key];
}
for (var i in o) {
if (o.hasOwnProperty(i)) {
var found = findObjectByKey(o[i], key)
if (found) {
return found
}
}
}
return null
}
这是一个示例对象,我要在其中删除所有键d
:
var a = {
b: {
c: {
d: 'Hello',
},
d: 'Hola',
e: {
f: {
d: 'Hey'
}
}
}
}
// To become
var a = {
b: {
c: {},
e: {
f: {}
}
}
}
还有,我们可以通过Ramda偶然地做到这一点吗?
谢谢
答案 0 :(得分:1)
要在适当位置更改对象,只需更改:
return o[key];
收件人:
delete o[key];
要返回新对象,请使用Object.assign()
创建一个新对象,然后删除有问题的密钥。然后递归其余键:
var a = {
b: {
c: {
d: 'Hello',
},
d: 'Hola',
e: {
f: {
d: 'Hey'
}
}
}
}
var findObjectByKey= function (o, key) {
if (!o || (typeof o === 'string')) { // assumes all leaves will be strings
return o
}
o = Object.assign({}, o) // make a shallow copy
if (o[key]) {
delete o[key] // delete key if found
}
Object.keys(o).forEach( k => {
o[k] = findObjectByKey(o[k], key) // do the same for children
})
return o // return the new object
}
let obj = findObjectByKey(a, 'd')
console.log(obj)
答案 1 :(得分:1)
使用R.when
,如果o
是对象,则对其应用R.pipe
。在管道中,使用R.dissoc
从对象中删除属性。使用R.map
迭代其他属性,并尝试删除每个属性。
const removePropDeep = R.curry((prop, o) => R.when(
R.is(Object),
R.pipe(
R.dissoc(prop),
R.map(removePropDeep(prop))
),
o
))
const a = {
b: {
c: {
d: 'Hello',
},
d: 'Hola',
e: {
f: {
d: 'Hey'
}
}
}
}
const result = removePropDeep('d')(a)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>