Javascript 用动态长度数组替换多个子字符串的更好方法?
我有很多字符串,我用数组的元素替换xxx。这些数组可以有不同的长度。我的代码目前正在运行,但我不确定这是否是最好的方法。你会怎么做或者优化它 可变项目=[{ str:'这是xxx,他xxx岁', 名单:[‘弗兰克’,‘14’] }, { str:'xxx和xxx是xxx', 名单:[“乔治”,“约翰”,正在学习] } ] items.forEachitem=>{ item.list.forEachs=>{ item.str=item.str.replacexxx,s } console.logitem.str;Javascript 用动态长度数组替换多个子字符串的更好方法?,javascript,arrays,Javascript,Arrays,我有很多字符串,我用数组的元素替换xxx。这些数组可以有不同的长度。我的代码目前正在运行,但我不确定这是否是最好的方法。你会怎么做或者优化它 可变项目=[{ str:'这是xxx,他xxx岁', 名单:[‘弗兰克’,‘14’] }, { str:'xxx和xxx是xxx', 名单:[“乔治”,“约翰”,正在学习] } ] items.forEachitem=>{ item.list.forEachs=>{ item.str=item.str.replacexxx,s } console.log
} 如果字符串太长,或者替换可以包含子字符串xxx,那么最好使用带有全局修饰符的正则表达式,并使用replace的回调从数组中使用索引选择项:
items.forEach(item => {
let index = 0;
item.str = item.str.replace(/xxx/g, m => item.list[index++]);
});
否则,您的解决方案就可以了
注:
1-您可能需要检查索引是否超出item.list.length,以防xxx多于item.list中的项目。一个安全的解决办法是:
item.str = item.str.replace(/xxx/g, m => item.list[index++] || m);
如果item.list[index++]未定义,则替换为m
2-如果您不关心如何修改item.list,那么通过使用shift而不是索引,整个解决方案可能会短得多:
例如:
可变项目=[{
str:'这是xxx,他xxx岁',
名单:[‘弗兰克’,‘14’]
},
{
str:'xxx和xxx是xxx',
名单:[“乔治”,“约翰”,正在学习]
}
]
items.forEachitem=>{
设指数=0;
item.str=item.str.replace/xxx/g,m=>item.list[index++];
}
console.logitems 通过这种方法,您可以为每种方法消除一个。。在这里,您使用str中的regexp搜索所有xxx,并使用array shift方法从列表数组中返回并删除第一个元素 可变项目=[{ str:'这是xxx,他xxx岁', 名单:[‘弗兰克’,‘14’] }, { str:'xxx和xxx是xxx', 名单:[“乔治”,“约翰”,正在学习] } ] items.forEachitem=>{ item.str=item.str.replace/xxx/g,函数x{ 返回item.list.shift; }; //item.list.forEachs=>{ //item.str=item.str.replacexxx,s // } console.logitem.str;
}如果你想对整个东西进行全局替换,你可以尝试转换为字符串并返回str='xxx喜欢xxx和xxx',list='John','xxx movies','cooking']可能无法按预期工作;我用的很好,你的代码更简单。我真的在使用,我的字符串可能有15-25个单词和4-7个单词。你会用我的方法还是正则表达式?我想正则表达式可能更快。@eag845我想你应该告诉我。你已经有很多数据要测试了。试着两者都跑,看看谁跑得最快
items.forEach(item => item.str.replace(/xxx/g, m => item.list.shift() || m));