从对象中删除值而不发生突变更新:

2022-08-30 04:31:37

在不改变原始对象的情况下,从特定键处的对象中删除值的一个好的简短方法是什么?

我想做这样的事情:

let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined

我知道有很多不可变的库可以完成这样的任务,但我想在没有库的情况下离开。但要做到这一点,一个要求是要有一个简单而简短的方法,可以在整个代码中使用,而不是将方法抽象为实用程序函数。

例如,为了添加值,我执行以下操作:

let o2 = {...o1, age: 31};

这很短,易于记忆,不需要实用程序函数。

删除值是否有类似的东西?ES6非常受欢迎。

谢谢!


答案 1

更新:

您可以从具有棘手的解构赋值的对象中删除属性:

const doSomething = (obj, prop) => {
  let {[prop]: omit, ...res} = obj
  return res
}

但是,如果要删除的属性名称是静态的,则可以使用简单的单行将其删除:

let {lastname, ...o2} = o

最简单的方法就是或者,您可以在更改对象之前克隆对象:

const doSomething = (obj, prop) => {
  let res = Object.assign({}, obj)
  delete res[prop]
  return res
}

或者,您可以使用 lodash 实用程序库中的省略函数

let o2 = _.omit(o, 'lastname')

它可以作为 lodash 包的一部分提供,也可以作为独立的 lodash.omit 包使用。


答案 2

使用 ES7 对象解构:

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }