我有一个对象,如下所示:
let obj = {foo: 1, bar: 2, baz: 3}
我想通过调用将要删除的属性名称作为参数的方法来删除特定属性
removeProperty(obj, propertyName) {
let { propertyName, _, ...result } = obj
return result
}
问题在于,该方法仅在我们直接用语法名称(如let { bar, _, ...result } = obj
编写属性名称时起作用,但由于将语法作为参数传递而无法将其用作参数,因此该方法无效作为新变量
我们如何做到这一点,如果可能的话,使用另一种解决方案,除了lodash的omit
答案 0 :(得分:7)
您可以在解构中使用计算出的属性:
let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
let { [propertyName]: _, ...result } = obj
return result
}
console.log(removeProperty(obj, 'foo'));
这会将值为值propertyName
的属性分配给一个一次性变量,并从本质上删除了该键。参见the MDN documentation。
答案 1 :(得分:1)
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'));
结果因所使用的浏览器而异。结果相当有趣。台式机Safari destructuring
的性能优于delete
,但台式机Chrome可以执行所有来自台式机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
答案 2 :(得分: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',
};