使用JavaScript拆分字符串:解决EJS循环中商品名拼接问题
你现在遇到的问题是:数据库返回的多个商品名直接粘连在一起(比如Item name1Item name2),想转成Item name1, Item name2的格式,但之前用split(" ")的思路完全走偏了——这个方法是按空格拆分每个单词,自然会把每个单词都用逗号分隔,结果就变成了Item,name,1Item,name,2,完全不是你要的效果。
咱们先抓核心:你的data[i].ITEMNAME本身是多个商品名无分隔符拼接的字符串,所以第一步得把这些商品名正确拆分,再用, 连接起来。
解决方案一:前端正则拆分(快速调试首选)
如果你的商品名有固定规律(比如每个商品名都是大写字母开头,就像例子里的Item),可以用正向预查正则来精准拆分,不会破坏商品名本身的结构:
// 拿到EJS渲染的粘连字符串 const combinedItems = '<%= data[i].ITEMNAME %>'; // 正则:在大写字母出现的位置前拆分(不切割原字符) const splitItemList = combinedItems.split(/(?=[A-Z])/); // 用逗号加空格连接成目标格式 const formattedNames = splitItemList.join(', '); // 插入表格单元格 document.write("<td>" + formattedNames + "</td>");
举个实际例子,Item name1Item name2会被拆成["Item name1", "Item name2"],再用join(', ')就得到你想要的Item name1, Item name2。如果你的商品名是其他固定开头(比如都是Product),可以把正则改成/(?=Product)/,针对性更强。
解决方案二:后端提前处理(更优雅的实践)
其实更推荐在后端从数据库取数据的时候就处理好格式,这样前端不用写额外的JS逻辑,代码更简洁:
假设你用Node.js做后端,查询数据库后可以直接处理字段:
// 假设从数据库拿到的每条数据是row row.ITEMNAME = row.ITEMNAME.split(/(?=[A-Z])/).join(', '); // 再把处理好的data传给EJS模板
然后前端EJS直接渲染就行:
<td><%= data[i].ITEMNAME %></td>
这样前端代码更干净,也避免了前端处理可能出现的兼容问题。
额外提醒
如果你的商品名没有固定的拆分规律(比如大小写混乱、没有统一开头),那得先确认数据库里的商品名为什么会粘连——是不是存储的时候就没加分隔符?最好从源头解决,比如入库时就用, 分隔商品名,这样前后端都不用额外处理。
内容的提问来源于stack exchange,提问作者Gianluca

