最快的搜索字符串

时间:2016-02-09 18:22:18

标签: javascript

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

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

最快的搜索方式是什么?

每次循环迭代中每行到数组的转换是否被认为是浪费?

感谢。

3 个答案:

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

谢谢大家的好主意!