我的数据行(第一行是标题,其余行是数据)作为单个参数传递给我的函数:
"id,first,last,email\n" +
"555,John,Doe,jd@gmail.com\n" +
"666,Jason,scott,js@gmail.com\n" +
.......
我想在这些行中搜索电子邮件值。如果我发现它,我应该返回完整的行。 所以我只需要在每一行中寻找第4个元素。
我在想这样的事情:
function search(data, key) {
var arr = text.split('\n'); /// convert data to array
return function (value) {
for (var i = 1; i < arr.length; i++) {
var dataLine = arr[i].split(','); /// "666,Jason,scott,js@gmail.com\n" to array
if (dataLine[keyIndex] === value) { /// found match between value and id
return "found";
}
}
return "not found";
}
}
最快的搜索方式是什么?
每次循环迭代中每行到数组的转换是否被认为是浪费?
感谢。
答案 0 :(得分:1)
您只需要查看每个arr
项中的 last 元素。因此,可以通过避免split()
调用来加速内部函数:
function(value) {
for (var i = 1; i < arr.length; i++) {
var item = arr[i];
if (item.substr(item.lastIndexOf(',')+1) === value) {
return "found";
}
}
return "not found";
}
顺便说一句,for循环从{1}}开始,忽略标题。
答案 1 :(得分:0)
我会尝试像这个/^([^,]*,){3}searched@mail.xyz(,.*)?$/gi
一样构造regexp并使用此regex作为参数运行输入字符串的match方法。
var fieldsBefore=keyIndex?"^([^,]*,){"+keyIndex+"}":"^"
var fieldsAfter="(,.*)?$"
var rx=new RegExp(fieldsBefore+searched+fieldsAfter,"g")
var result=input.match(rx)
if(result){//lines found
...
}
else{//not found
...
}
答案 2 :(得分:0)
以下dandavis建议我将功能修改为:
function search(data, key) {
var arr = text.split('\n'); /// convert data to array
return function (value) {
var arrByID = arr.filter(filterByID, value);
console.log(arrByID); /// -> ["555,John,Doe,jd@gmail.com"]
}
}
function filterByID(stringLine) {
if (stringLine.indexOf(this) > -1) {
return true;
}
}
谢谢大家的好主意!