JavaScript内置函数来删除一个对象中的多个键?

JavaScript内置函数来删除一个对象中的多个键?,javascript,Javascript,在JavaScript中,我可以使用 删除myObject[myKey] 有时,我需要删除相当多的键,但不是父键中封装我要删除的键的所有值 有没有一种有效的方法可以使用一行删除多个键?看起来像: multi-delete myObject[keyOne、keyTwo、keyTwo]没有内置函数,但是可以这样做的一种方法是将multidelete方法添加到对象原型中。这可能有点过分,但你可能会发现它很有用 if (!('multidelete' in Object.prototype)) {

在JavaScript中,我可以使用

删除myObject[myKey]

有时,我需要删除相当多的键,但不是父键中封装我要删除的键的所有值

有没有一种有效的方法可以使用一行删除多个键?看起来像:


multi-delete myObject[keyOne、keyTwo、keyTwo]

没有内置函数,但是可以这样做的一种方法是将
multidelete
方法添加到对象原型中。这可能有点过分,但你可能会发现它很有用

if (!('multidelete' in Object.prototype)) {
    Object.defineProperty(Object.prototype, 'multidelete', {
        value: function () {
            for (var i = 0; i < arguments.length; i++) {
                delete this[arguments[i]];
            }
        }
    });
}

var obj = { a: 1, b: 2, c: 3, d: 4, e: 5 };

obj.multidelete('c', 'e'); // { a: 1, b: 2, d: 4 };
if(!('multidelete'在Object.prototype中)){
Object.defineProperty(Object.prototype,'multidelete'{
值:函数(){
for(var i=0;i

这是一条与您的要求类似的单行线

var obj = {a: 1, b: 2, c: 3, d: 4, e: 5 };

['c', 'e'].forEach(e => delete obj[e]);

// obj is now {a:1, b:2, d:4}

目前还没有内置的js函数来删除多个键,您可以使用任何库(如
underline.js
)来执行此操作

\省略({name:'moe',年龄:50,userid:'moe1'},'userid');
=>{姓名:'moe',年龄:50}
//或者,您可以使用该函数筛选关键点
_.omit({name:'moe',age:50,userid:'moe1'},函数(值、键、对象){
返回u0.isNumber(值);
});
=>{name:'moe',userid:'moe1'}

使用库lodash有一个简单的修复方法

_uz.omit函数获取您的对象和要删除的键数组,并返回一个新对象,该对象包含原始对象的所有属性,数组中提到的属性除外

这是一种删除关键点的简洁方法,因为使用它可以获得一个新对象,而原始对象保持不变。这避免了突变的问题,如果我们删除了原始对象中的键,那么使用该对象的代码的所有其他部分都可能有破坏代码或在代码中引入错误的倾向

例如:

var obj = {x:1, y:2, z:3};
var result = _.omit(obj, ['x','y']);
console.log(result);

//Output
result = {z:3};

单击相同文档的链接,也可以使用对象分解

const obj = {
        a: 'dog',
        b: 'cat',
        c: 'mouse',
        d: 'cow',
        e: 'horse',
    };
const {a, e, ...updatedObject} = obj;

// output
console.log(updatedObject)

您可以通过字符串创建要删除的键数组,并在对象上迭代以删除它们

var obj = {key1: 1, key2: 2, key3: 3 };

"key1 key2 key3".split(" ").forEach(e => delete obj[e]);

如果您想要一个感觉内置的解决方案,您可以添加一个实用程序函数,其工作原理类似于,这样您可以向给定对象添加属性,但现在还可以通过提交
null
属性描述符来删除属性

Object.defineProperties()
如果属性描述符不是对象,则会引发错误,因此我们可以安全地使用“falsy”值来指示要删除的属性

代码如下:

function unDefineProperties(obj, propertyDescriptors) {
  const [normalDescriptors, toBeDeletedDescriptors] =
    partition(Object.entries(propertyDescriptors),([_, descriptor]) => descriptor);
  Object.defineProperties(obj, Object.fromEntries(normalDescriptors));
  toBeDeletedDescriptors.forEach(([name, _]) => delete obj[name]);
  return obj;
}
该函数的名称应理解为“(un)定义属性”,即“定义或删除属性”

它使用实用程序函数
分区
(在下面的代码段中定义,从中借用),将给定的
属性脚本
拆分为具有非“falsy”值的“普通”属性脚本和具有“falsy”值的“待删除”属性脚本

然后它调用
Object.defineProperties()
,并使用从“普通”条目重构的属性描述符对象

在此之后(因为第一步可能由于不正确的属性描述符而失败),所有“待删除”条目将删除
obj
中的相应属性

最后,返回
obj
,以模拟
Object.defineProperties()
的方便行为

生成的函数与原始的
对象兼容。defineProperties()
(当然,除了“falsy”属性描述符的行为之外),因此可以用作原始函数的替换。如果要这样做,为了保持一致性,还应使用类似的函数替换
Object.defineProperty()
(单数!),该函数通过删除相应的属性(留给读者作为练习;-)来处理“falsy”属性描述符

以下是完整的代码和使用示例:

函数分区(数组、过滤器){
让通过=[],失败=[];
forEach((e,idx,arr)=>(filter(e,idx,arr)?pass:fail.push(e));
返回[通过,失败];
}
函数未定义属性(obj、propertyDescriptors){
常量[NormalDescriptor,toBeDeletedDescriptors]=
分区(Object.entries(propertyDescriptors),([\ux,descriptor])=>descriptor);
Object.defineProperties(obj,Object.fromEntries(normalDescriptor));
toBeDeletedDescriptors.forEach(([name,])=>delete obj[name]);
返回obj;
}
//用法示例:
常量obj={a:a',b:b',c:c'};
未定义属性(obj{
答:空,
c:空,
d:{value:“d”,可枚举:true}
});

console.log(obj);//日志{“b”:“b”,“d”:“d”}
从什么角度来看是有效的?首先,使用
delete
已经是低效的。但是不是父项中封装了我要删除的键的所有值,您能澄清一下吗?你说的“父键”或“封装键”是什么意思?如果你要像那样循环参数,没有必要先对它进行切片。另外,
enumerable
configurable
默认为
false
,不需要显式指定。请注意,使用此方法,您还声明了变量a和e,它们分别等于“dog”和“horse”。这是首选的,因为它不会改变原始对象