Node.js中includes方法为何需匹配完整字符串?
问题原因与解决方案
核心问题
你用csv-parse解析文本文件后,回调里的row是数组类型,而非字符串。比如文件中19180 - Testing这一行,会被解析成['19180 - Testing'](因为你的分隔符是逗号,但行内没有逗号,所以整个行作为数组的唯一元素)。此时调用row.includes(serialmodel),实际是检查数组中是否存在完全等于19180的元素,自然匹配不到,只有当serialmodel和数组元素完全一致时才会生效。
修复代码
把数组转换成字符串后再调用includes,直接取数组的第一个元素(因为每行只有一个内容)即可:
function PopulateModelList() { const fs = require("fs"); const { parse } = require("csv-parse"); var modellist = document.getElementById('model'); var serial = document.getElementById("serialnumberinput").value; var serialmodel = serial.substring(0,5); var testing = document.getElementById("modeltesting"); testing.innerHTML += serialmodel; // 清空之前的选项,避免重复添加 modellist.innerHTML = '<option value="" selected="selected" >Select Model</option>'; fs.createReadStream("./model.txt") .pipe(parse({ delimiter: ",", from_line: 1, })) .on("data", function(row) { console.log(row); // 取数组第一个元素转换成字符串,再检查是否包含serialmodel const modelStr = row[0]; if (modelStr.includes(serialmodel)) { modellist.innerHTML += '<option value="' + modelStr + '">' + modelStr + '</option>' ; } }) }
额外优化建议
- 每次执行
PopulateModelList时,先清空下拉框的原有选项(上面代码已添加),避免多次点击提交后重复添加相同选项。 - 如果你的
model.txt每行是纯文本(没有逗号分隔),其实可以不用csv-parse,直接用fs.readFile按行读取,代码会更简洁:
function PopulateModelList() { const fs = require("fs"); var modellist = document.getElementById('model'); var serial = document.getElementById("serialnumberinput").value; var serialmodel = serial.substring(0,5); var testing = document.getElementById("modeltesting"); testing.innerHTML += serialmodel; modellist.innerHTML = '<option value="" selected="selected" >Select Model</option>'; fs.readFile("./model.txt", "utf8", (err, data) => { if (err) throw err; const lines = data.split("\n"); lines.forEach(line => { if (line.trim() && line.includes(serialmodel)) { // 跳过空行 modellist.innerHTML += '<option value="' + line + '">' + line + '</option>' ; } }); }); }
内容的提问来源于stack exchange,提问作者CB700
相关产品推荐
相关产品推荐

