我有很多字符串,并且用数组元素替换了“ xxx”。这些阵列可以具有不同的长度。我的代码当前正在运行,但是我不确定这是否是最好的方法。您将如何做或对其进行优化?
var items = [{
str: 'This is xxx an he is xxx years old ',
list: ['Frank', '14']
},
{
str: 'xxx and xxx are xxx ',
list: ['George', 'John', "studying"]
}
]
items.forEach(item => {
item.list.forEach(s => {
item.str = item.str.replace("xxx", s)
})
console.log(item.str);
})
答案 0 :(得分:1)
如果字符串太长或替换字符串中可以包含子字符串"xxx"
,那么最好使用带有全局修饰符的正则表达式,并使用replace
的回调使用索引从数组中选择一项:
items.forEach(item => {
let index = 0;
item.str = item.str.replace(/xxx/g, m => item.list[index++]);
});
否则,您的解决方案就可以了。
注释:
1-如果index
的数量超过item.list.length
中的项目,则可能要检查xxx
是否超出item.list
。一个安全的解决方案是:
item.str = item.str.replace(/xxx/g, m => item.list[index++] || m);
如果m
为item.list[index++]
,则用undefined
替换。
2-如果您不关心突变item.list
,那么通过使用shift
而不是index
可以缩短整个解决方案的时间:
items.forEach(item => item.str.replace(/xxx/g, m => item.list.shift() || m));
示例:
var items = [{
str: 'This is xxx an he is xxx years old ',
list: ['Frank', '14']
},
{
str: 'xxx and xxx are xxx ',
list: ['George', 'John', "studying"]
}
]
items.forEach(item => {
let index = 0;
item.str = item.str.replace(/xxx/g, m => item.list[index++]);
})
console.log(items);
答案 1 :(得分:0)
使用此方法,您可以摆脱每种方法之一。.在这里,您正在“ str”中使用regexp搜索所有“ xxx”,并使用array shift()方法返回并从“ list”中删除第一个元素“数组。
var items = [{
str: 'This is xxx an he is xxx years old ',
list: ['Frank', '14']
},
{
str: 'xxx and xxx are xxx ',
list: ['George', 'John', "studying"]
}
]
items.forEach(item => {
item.str = item.str.replace(/xxx/g,function (x) {
return item.list.shift();
});
// item.list.forEach(s => {
// item.str = item.str.replace("xxx", s)
// })
console.log(item.str);
})