在字符串行中搜索速度最快

Fastest search in lines of string

本文关键字:速度 搜索 字符串      更新时间:2023-09-26

我有数据行(第一行是标题,其余行是数据)作为单个参数传递我的函数:

"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";
    }
}

最快的搜索方式是什么?

在每次循环迭代中将每一行转换为数组是否被视为浪费?

谢谢。

您只需要查看每个arr项中的最后一个元素。因此,可以通过避免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 开始i以忽略标头。

我会尝试像这样/^([^,]*,){3}searched@mail.xyz(,.*)?$/gi构造正则表达式,并使用此正则表达式作为参数运行输入字符串的匹配方法。

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
...
}

按照丹达维斯的建议,我将函数修改为:

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;
    }
}

谢谢大家的好主意!