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

gke*_*ley 0 javascript regex algorithm object

我有以下 JS 对象:

let obj = {
    'a': 1,
    'a-gaboom': 1,
    'b': 1,
    'b-gaboom': 1
};
Run Code Online (Sandbox Code Playgroud)

我想删除所有以 . 结尾的字段'-gaboom'

我可以手动完成:

delete obj['a-gaboom'];
delete obj['b-gaboom'];
Run Code Online (Sandbox Code Playgroud)

但我想使用正则表达式动态地执行此操作?

Dan*_*ger 5

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

无论如何,这就是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);
Run Code Online (Sandbox Code Playgroud)

如果你想要一些更具可读性的东西或者一句台词,我会选择@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);
Run Code Online (Sandbox Code Playgroud)