Сопоставьте и замените все строки внутри объекта на строки из другого объекта - PullRequest
0 голосов
/ 26 января 2020

У меня есть объект, который содержит символы UTF-8 в виде строк - я подумал, что мог бы создать другой объект со списком символов и как бы я хотел их заменить?

Объект данных

var data = [
  {"my_string":"ABC & I","value":13,"key":8},
  {"my_string":"A “B” C","value":12,"key":9}
 ];

Заменяющий объект

var str_to_change = [
    {value: "&", replace: "&"},
    {value: "“", replace: ""},
    {value: "”", replace: ""}
];

Я хотел бы написать функцию, где в любое время str_to_change.value будет виден внутри data.my_string , замените его на str_to_change.replace

Это лучший способ go об изменении различных строк символов, и как мне выполнить это? Я нашел это: Итерация по объектному литералу и замена строк , но это немного сложнее, так как я не просто заменяю единственной строкой.

1 Ответ

3 голосов
/ 26 января 2020

Вместо массива объектов рассмотрите возможность создания просто одного объекта с несколькими ключами:

const replacements = {
  "&": "&",
  "“": '',
  "”": '',
};

Затем с ключами экранируйте символов с особое значение в регулярных выражениях, соедините ключи с помощью |, создайте регулярное выражение и получите функцию-заменитель для доступа к сопоставленной подстроке как свойству объекта replacements:

var str_to_change = [{value: "&", replace: "&"},
{value: "“", replace: ""},
{value: "”", replace: ""}];
const replacements = Object.fromEntries(str_to_change.map(({ value, replace }) => [value, replace]));
const escape = s => s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
const pattern = new RegExp(Object.keys(replacements).map(escape).join('|'), 'gi');

var data = [{
  "my_string": "ABC & I",
  "value": 13,
  "key": 8
},
{
  "my_string": "A “B” C",
  "value": 12,
  "key": 9
}];

const mappedData = data.map(({ my_string, ...rest }) => ({
  ...rest,
  my_string: my_string.replace(
    pattern,
    prop => replacements[prop]
  )
}));
console.log(mappedData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...