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

时间:2018-09-20 15:59:08

标签: javascript ramda.js

我有一个大型的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偶然地做到这一点吗?

谢谢

2 个答案:

答案 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>