Заменить вхождения в строке, используя массив строк - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть следующее:

 var arr = [{id: 0, title: 'This is a test Hello World Hello'}, {id: 1, title: 'I like the World'}, {id: 2, title: 'The Sun is bright'}, {id: 3, title: 'Cat'}],
replaceMents = ['Hello', 'World'];

Я бы хотел иметь такой массив после замены:

[{
  id: 0,
  title: 'This is a test'
}, {
  id: 1,
  title: 'I like the'
}, {
  id: 2,
  title: 'The Sun is bright'
}, {
  id: 3,
  title: 'Cat'
}]

Поскольку я не хочу использовать классический arr.forEach, я ищу более подходящее решение.

Какие есть возможности?

Я думал что-то вроде

var newArr = arr.map(el => replaceMents.forEach(rep => el.title.replace(rep, '')))

Ответы [ 2 ]

3 голосов
/ 06 апреля 2019

Другой вариант без использования регулярных выражений, а затем, возможно, потребуется другое регулярное выражение для экранирования специальных символов.Можно ли разделить фильтр объединения.

const arr = [{id: 0, title: 'This is a test Hello World Hello'}, {id: 1, title: 'I like the World'}, {id: 2, title: 'The Sun is bright'}, {id: 3, title: 'Cat'}]
const replaceMents = ['Hello', 'World'];

const newArr = arr.map(({ id, title }) => (
  { id, title: 
    title.split(' ').
      filter(f => !replaceMents.includes(f)).
      join(' ')
  }));
console.log(newArr);
2 голосов
/ 06 апреля 2019

Один из вариантов - создать регулярное выражение, которое чередуется между каждым словом для замены, а затем внутри .map заменить все вхождения этих слов пустой строкой:

const arr = [{id: 0, title: 'This is a test Hello World Hello'}, {id: 1, title: 'I like the World'}, {id: 2, title: 'The Sun is bright'}, {id: 3, title: 'Cat'}]
const replaceMents = ['Hello', 'World'];

const pattern = new RegExp(replaceMents.join('|'), 'g');

const newArr = arr.map(({ id, title }) => ({ id, title: title.replace(pattern, '').trim() }));
console.log(newArr);

Если замены могут содержать символы со специальным значением в регулярном выражении (например, ., $ и т. Д.), То перед присоединением необходимо их экранировать:

const escapeRegex = s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');

new RegExp(replaceMents.map(escapeRegex).join('|'), 'g')

Есть ли функция RegExp.escape в Javascript?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...