首页 > 解决方案 > 将对象内的所有字符串匹配并替换为来自另一个对象的字符串

问题描述

我有一个包含 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里面看到a data.my_string,就把它替换为str_to_change.replace

这是更改各种字符串的最佳方法,我将如何执行?我发现了这一点:遍历对象文字并替换字符串,但它有点复杂,因为我不只是用单数字符串替换。

标签: javascriptstring

解决方案


考虑构造一个带有多个键的对象,而不是一个对象数组

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


推荐阅读