16

我有一个对象如下:

let obj = {foo: 1, bar: 2, baz: 3}

我想通过调用将要删除的属性名称作为参数的方法来删除特定属性

removeProperty(obj, propertyName) {
  let { propertyName, _, ...result } = obj
  return result
}

问题是这个方法只有在我们直接在语法中写属性名时才有效,比如let { bar, _, ...result } = obj

我们怎么能做到这一点,如果可能的话,除了omitlodash之外的另一种解决方案

4

3 回答 3

35

您可以在解构中使用计算属性:

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let { [propertyName]: _, ...result } = obj
  return result
}
console.log(removeProperty(obj, 'foo'));

这会将具有值名称的属性分配给propertyName一次性变量,并从本质上删除该键。请参阅MDN 文档

于 2018-12-13T00:16:20.837 回答
9

另一种选择destructuring是使用delete. destructuring与(在桌面 Chrome 中)相比,以下解决方案将时间复杂度降低了约 35%

解决方案

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let newObj = {...obj};
  delete newObj[propertyName];
  return newObj;
}
console.log(removeProperty(obj, 'foo'));

性能测试

https://jsperf.com/so53753276

结果因使用的浏览器而异。结果相当有趣。Desktop Safari的destructuring表现优于delete,但 Desktop Chrome 的表现优于 Desktop Safari。

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 3,229,791 | 1,993,256   |
| Safari  | 1,186,679 | 1,872,396   | 
+---------+-----------+-------------+

iOS 上的结果并不令人惊讶,因为 Chrome 只是真正的 Safari。

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 1,146,496 | 1,785,551   |
| Safari  | 1,182,067 | 1,793,772   | 
+---------+-----------+-------------+

文档

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

于 2018-12-13T00:31:03.313 回答
1
values = {
    id: 1,
    name: 'hello world',
    vehicle: 'car',
    time: '3.30 pm',
    date: '02 MAR 1990',
};

const { time, date, ...rest } = values;

now ***...rest*** contains the object values of {
    id: 1,
    name: 'hello world',
    vehicle: 'car',
};
于 2020-08-06T07:29:13.820 回答