如何从JavaScript对象中删除所有与正则表达式匹配的属性?

nuypyhwy  于 2023-01-01  发布在  Java
关注(0)|答案(3)|浏览(144)

我有下面的JS对象:

let obj = {
    'a': 1,
    'a-gaboom': 1,
    'b': 1,
    'b-gaboom': 1
};

我想删除所有以'-gaboom'结尾的字段。
我可以使用以下工具手动执行此操作:

delete obj['a-gaboom'];
delete obj['b-gaboom'];

但是我想用一个RegExp动态地完成它?

l7wslrjt

l7wslrjt1#

您可以使用String.prototype.includes()String.prototype.indexOf()来完成,即使它们不会考虑-gaboom是否出现在键的末尾或任何其他位置,或者使用String.prototype.endsWith(),这将确保匹配出现在键的末尾:

const obj = {
    'a': 1,
    'a-gaboom': 1,
    'b': 1,
    'b-gaboom': 1
};

for (const key in obj) {
  if (key.endsWith('-gaboom')) delete obj[key];
}

console.log(obj);

无论如何,这将是RegExp的样子,它通过使用$确保-gaboom位于密钥的末尾,并且可以很容易地进行调整,以比上面的任何其他替代方案更灵活:

const obj = {
    'a': 1,
    'a-gaboom': 1,
    'b': 1,
    'b-gaboom': 1
};

for (const key in obj) {
  if (/-gaboom$/.test(key)) delete obj[key];
}

console.log(obj);

如果您想使用可读性更强的代码或一行程序,我会使用@OriDrori的方法或类似的Array.prototype.reduce()

const obj = {
    'a': 1,
    'a-gaboom': 1,
    'b': 1,
    'b-gaboom': 1
};

const filtered = Object.keys(obj).filter(key => !/-gaboom$/.test(key)).reduce((acc, key) => {
  acc[key] = obj[key]; 
  return acc;
}, { });

console.log(filtered);
vaqhlq81

vaqhlq812#

你可以用Object.entries()获取对象的条目([key,value]对的数组)。Filter是条目数组,只保留键不以-gaboom结尾的条目。通过Object.fromEntries()转换回对象:

const obj = {'a': 1,'a-gaboom': 1,'b': 1,'b-gaboom': 1}

const result = Object.fromEntries(
  Object.entries(obj)
    .filter(([key]) => !key.endsWith('-gaboom'))
)

console.log(result)
ycl3bljg

ycl3bljg3#

从其他答案中得到提示,使用该通用函数,可以消除在改变原始对象时验证特定条件的所有键。

deleteKeys = function (obj, fn) {
  Object.entries(obj)
    .filter(([key, value]) => fn(key, value))
    .forEach(([key]) => delete obj[key]);
};

const obj = {'a': 1,'a-gaboom': 1,'b': 1,'b-gaboom': 1};

deleteKeys(obj, (key) => !key.endsWith("-gaboom"));

console.log(obj)

相关问题