[英]How to remove all instances of a specific key in an object?
我有一个大型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做到这一点?
谢谢
要更改位置的对象,您只需更改:
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)
使用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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.