繁体   English   中英

如何删除对象中特定键的所有实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM