使用不区分大小写的正则表达式从JS数组中过滤和删除项目

时间:2019-01-17 20:38:40

标签: javascript ecmascript-6

在给定数组上:

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

如果我想返回一个不包括史蒂夫的人的新数组,我可以运行:

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

在不使用toLowerCase()的情况下,如果Steve名称可以小写或大写,我该如何编写正则表达式来达到相同的结果?

  { 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" },

3 个答案:

答案 0 :(得分:5)

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

注意:如果要精确匹配,即忽略包含名称(例如“ steven”)的字符串,则可以使用^steve$(请参阅boundaries)。

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);

答案 1 :(得分:2)

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

const filteredArr = arr.filter(obj => !/Steve/i.test(obj.fn));

console.log(filteredArr);

i regex flag允许您匹配结果,而不考虑大小写(大写/小写)。

答案 2 :(得分:2)

为什么不使用.localeCompare(compareString[, locales[, options]])

  

localeCompare()方法返回一个数字,该数字指示参考字符串是按排序顺序位于给定字符串之前还是之后还是与之相同。

在选项中,您可以设置灵敏度

  

“重音符号”:仅将基本字母或重音符号不同的字符串和其他变音符号比较为不相等。例如:a≠b,a≠á,a = A。

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

const filteredArr = arr.filter(obj => obj.fn.localeCompare("steve", undefined, 
                                                        { sensitivity: 'accent' }));
console.log(filteredArr);