首页 > 解决方案 > 使用不区分大小写的正则表达式从 JS 数组中过滤和删除项目

问题描述

在给定的数组上:

const arr = [
  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "Steve", ln: "King" }
];

如果我想返回一个不包括任何名为 Steve 的新数组,我可以运行:

const filteredArr = arr.filter(obj => obj.fn != "Steve");

如果不使用toLowerCase(),在史蒂夫姓名可能是小写或大写的情况下,我如何编写正则表达式来获得相同的结果?

  { fn: "Steve", ln: "Jobs" },
  { fn: "Dennis", ln: "Rodman" },
  { fn: "Karl", ln: "Malone" },
  { fn: "Vince", ln: "Carter" },
  { fn: "steVe", ln: "King" },
  { fn: "STEVE", ln: "Jordan" },
  { fn: "steve", ln: "Clark" },

标签: javascriptecmascript-6

解决方案


RegExp.test()使用方法检查字符串,并在正则表达式中使用i标志(忽略大小写)。

注意:如果您想要完全匹配,即忽略包含名称的字符串 - 例如“steven” - 您可以使用^steve$(参见边界)。

const arr = [{"fst":"Steve","snd":"Jobs"},{"fst":"Dennis","snd":"Rodman"},{"fst":"Karl","snd":"Malone"},{"fst":"Vince","snd":"Carter"},{"fst":"steVe","snd":"King"},{"fst":"STEVE","snd":"Jordan"},{"fst":"steve","snd":"Clark"}];

const pattern = /steve/i; // or /^steven$/i
const result = arr.filter(obj => !pattern.test(obj.fst));

console.log(result);

您可以使用 RegExp 构造函数使其可重用:

const arr = [{"fst":"Steve","snd":"Jobs"},{"fst":"Dennis","snd":"Rodman"},{"fst":"Karl","snd":"Malone"},{"fst":"Vince","snd":"Carter"},{"fst":"steVe","snd":"King"},{"fst":"STEVE","snd":"Jordan"},{"fst":"steve","snd":"Clark"}];

const removeItem = (arr, str, key = 'fst') => {
  const pattern = new RegExp(str, 'i'); // or new RegExp(`^${str}$`, 'i')

  return arr.filter(obj => !pattern.test(obj[key]));
};

const result = removeItem(arr, 'steve');

console.log(result);


推荐阅读