Javascript 用动态长度数组替换多个子字符串的更好方法?

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。这些数组可以有不同的长度。我的代码目前正在运行,但我不确定这是否是最好的方法。你会怎么做或者优化它

可变项目=[{ str:'这是xxx,他xxx岁', 名单:[‘弗兰克’,‘14’] }, { str:'xxx和xxx是xxx', 名单:[“乔治”,“约翰”,正在学习] } ] items.forEachitem=>{ item.list.forEachs=>{ item.str=item.str.replacexxx,s } console.logitem.str;
} 如果字符串太长,或者替换可以包含子字符串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));