在一个对象中删除多个键的内置函数
JavaScript - Built in Function to Delete Multiple Keys in an Object?
在JavaScript中,我可以使用
删除对象的键 delete myObject[myKey];
是否有一种有效的方法来删除多个键使用一行?看起来像:
multiDelete myObject[keyOne, keyTwo, keyThree];
下面是与您请求的内容类似的一行代码:
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}
你也可以使用对象解构。
const obj = {
a: 'dog',
b: 'cat',
c: 'mouse',
d: 'cow',
e: 'horse',
};
const {a, e, ...updatedObject} = obj;
// output
console.log(updatedObject)
有一个使用lodash库的简单修复方法。
_。省略函数接受你的对象和一个你想要删除的键数组,并返回一个新对象,它具有原对象的所有属性,除了数组中提到的那些属性。
这是一种删除键的简洁方式,因为使用它可以获得一个新对象,而原始对象保持不变。这避免了突变的问题,如果我们删除了原始对象中的键,那么使用该对象的代码的所有其他部分可能会有中断或在代码中引入错误的倾向。
的例子:
var obj = {x:1, y:2, z:3};
var result = _.omit(obj, ['x','y']);
console.log(result);
//Output
result = {z:3};
相同文档的链接点击这里
没有内置的js函数来删除多个键,您可以使用任何库,如underscore.js
来做到这一点。
_.omit({name: 'moe', age: 50, userid: 'moe1'}, 'userid');
=> {name: 'moe', age: 50}
//or you can use function to filter keys
_.omit({name: 'moe', age: 50, userid: 'moe1'}, function(value, key, object){
return _.isNumber(value);
});
=> {name: 'moe', userid: 'moe1'}
没有内置函数,但是您可以这样做的一种方法是将multidelete
方法添加到Object原型中。这可能有点过分,但你可能会发现它很有用。
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 };
演示如果您想要一个内置的解决方案,您可以添加一个像Object.defineProperties()
一样的实用程序函数,这样您可以向给定对象添加属性,但现在也可以通过提交null
属性描述符来删除属性。
Object.defineProperties()
将抛出错误,因此我们可以安全地使用&;值,表示要删除该属性。
代码如下:
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)define properties",即"定义或删除属性"。
它将给定的propertyDescriptors
拆分为"normal"那些没有"假的"的;值和"要删除"的值。那些带有"虚假"字样的;值,使用实用函数partition
(在下面的代码片段中定义,借用了这个答案)。
然后调用Object.defineProperties()
,并使用一个从"normal"重新构造的属性描述符对象。条目。
在之后(因为第一步可能由于不正确的属性描述符而失败),所有要删除的"条目删除obj
中相应的属性。
最后返回obj
,以模仿Object.defineProperties()
的方便行为。
结果函数与原始Object.defineProperties()
兼容(当然,除了" false "的行为)属性描述符),因此可以用作原始函数的替代品。如果您想这样做,为了保持一致性,您还应该用处理" false "的类似函数替换Object.defineProperty()
(单数!)属性描述符,通过删除相应的属性(留给读者作为练习;-))。
const partition = (array, filter) =>
array.reduce(([pass, fail], e, i) =>
((filter(e, i, array) ? pass : fail).push(e), [pass, fail]),
[[], []]);
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;
}
// Usage example:
const obj = { a: 'A', b: 'B', c: 'C'};
unDefineProperties(obj, {
a: null,
c: null,
d: { value: "D", enumerable: true }
});
console.log(obj); // logs { "b": "B", "d": "D" }
您可以创建一个键数组,通过一个字符串来删除它们,并遍历该对象来删除它们
var obj = {key1: 1, key2: 2, key3: 3 };
"key1 key2 key3".split(" ").forEach(e => delete obj[e]);
我找到了另一个解决方案,使用循环通过Object.entries()
,这可能是有用的:
var array = {1:'a',2:'b',3:'c',4:'d'};
for (var [key, char] of Object.entries(array)) {
delete array[key];
}
- 无需Javascript内置函数即可将十进制转换为十六进制
- 从函数向内置函数中添加多个参数
- jQuery.remove()不起作用,而其他内置函数则起作用
- JavaScript ES6:测试箭头函数、内置函数、常规函数
- 如何查找函数是内置函数还是用户定义的函数
- WordPress内置函数无法在ajax php文件上识别
- 在 JavaScript 中将数组作为内置函数参数传递
- mapquest 中的内置函数,用于从地址获取纬度
- 是否有一个内置函数可以将创建日期添加到couchDB中的文档中
- Javascript中的内置函数用于格式化日期
- buble对数组进行排序,并在不使用javascript内置函数的情况下将它们合并
- 如何在没有任何内置函数的情况下将元素添加到数组中
- 如何在JavaScript中使用内置函数更改属性值
- 如何列出JavaScript内置函数的属性
- 对象javascript没有内置函数hasOwnProperty
- 为什么IE8中的一些内置函数不是Function的实例
- 如何使用自定义格式化器内置函数来调用非jqgrid独立函数
- 在JavaScript中过滤数组,而不使用任何内置函数或新数组
- 在一个对象中删除多个键的内置函数
- 任何javascript内置函数转换HTML实体从url传递