Фильтровать и удалять элементы из массива JS с регулярным выражением без учета регистра - PullRequest
0 голосов
/ 17 января 2019

Для данного массива:

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(), Как я мог бы написать регулярное выражение для достижения того же результата в случае, когда имена Стива могли быть в нижнем или верхнем регистре?

  { 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 голосов
/ 17 января 2019

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 позволяет сопоставлять результаты независимо от заглавных букв (прописных / строчных).

0 голосов
/ 17 января 2019

Почему бы не использовать .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);
0 голосов
/ 17 января 2019

Проверьте строки с помощью метода 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...