如何搜索字符串数组并产生暗示结果

时间:2017-04-07 22:36:03

标签: javascript arrays string search

我在JavaScript中有一个字符串数组。我正在尝试开发一个

的功能
  1. 将子字符串作为输入。
  2. 搜索数组。
  3. 从靠近子字符串的数组返回字符串。该列表将作为建议提供给来电者。
  4. 例如: -

    Array包含以下条目。

    Hello
    What is hello
    World
    Spacearenotthereinthishello
    HELLO
    Highway to hell
    JavaScript
    StackOverflow
    

    我调用如下所示的函数

    var result [] = searchFunc(' hell');

    结果数组应包含

    Hello
    What is hello
    Spacearenotthereinthishello
    HELLO
    Highway to hell
    

    阵列可能包含至少100个字符串(或更多)。我正在寻找可扩展的解决方案。

    最初,我认为我应该排序然后进行二分搜索,但如果您想从主数组中获取特定字符串输入的所有建议,那么这很麻烦。我正在寻找可以帮助我实现更快搜索的算法。我并不担心主数组中的插入时间复杂性。

    我确实查找了多个堆栈溢出帖子。他们确实谈到了搜索特定字符串的大书。他们都没有谈论从数组中为子字符串返回建议。

    感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

YourArray.filter()将完成这项工作。快速原型:

var results = arrayName.filter(function(value) {
  return value.toLowerCase().indexOf(searchStr.toLowerCase()) >= 0;
});

答案 1 :(得分:0)

快速回答(TL; DR)

  • 使用Array.prototype.filter()

详细答案

上下文

  • 的Javascript
  • 阵列过滤

问题

  • 场景:开发人员希望为子字符串上的匹配过滤数组

解决方案

// declare array of string fragments
myArrayOfStringFragments = /* TODO: get the content [ ... ] */

// optional step, normalize all strings to lower-case
/* TODO: input normalization with Array.prototype.map() or something similar */

// declare comparison function
function strContainsMatch(slookfor) {
  return slookfor.includes("ello");
}

// iterate using Array.prototype.filter()
var filtered = myArrayOfStringFragments.filter(strContainsMatch);

陷阱

  • 数据输入规范化(基于字母大小写的差异?)
  • 基于非ascii字符的字符串比较
  • string.includes()方法可能不可用,而是使用string.indexOf()
  • 避免基于所选子字符串的错误匹配
    • (例如,如果您正在寻找hello,则hell将匹配超出您想要的内容,如果您的输入未标准化为小写,则会错过Hello

另见

答案 2 :(得分:0)

另一种解决方案是创建一个正则表达式来做同样的事情。

var condition = new RegExp("hell", 'g');

var results = arrayName.filter(function(value) {
    return condition.test(value.toLowerCase())
});