如何有效地在多个阵列中搜索项目?

时间:2017-05-12 05:59:40

标签: javascript arrays

我有3个数组,我需要找到字符串匹配的数组。

例如:



var arr1 = ['apple','banana','orange'];
var arr2 = ['abc','def','ghi'];
var arr3 = ['james','joe','robert','msg'];
var search = "abc joe 12345 msg:(somecontent)";
var arr = search.split(' ');
        
    for(var i in arr){
        
        if(arr1.indexOf(arr[i]) != -1) {
          console.log('Found in arr1');
        }
        else if(arr2.indexOf(arr[i])!= -1){
          console.log('Found in arr2');
        }
        else if(arr3.indexOf(arr[i])!=-1){
          console.log('Found in arr3');
        }
        else{
          console.log('Not Found');
        }
        
    }




当每个数组中有数千个项目时,是否有一种有效的方法来执行此搜索。

我对搜索字符串的另一个麻烦是,我需要将msg从(somecontent)中拆分出来。我能做的一件事就是将arr[3].split(":");分开。但问题是msg :(某些内容)每次都不会出现在同一个位置。所以我不能做arr[3].split(":");。我只在#arr'中搜索。如果我执行arr[3].split(":");,我将创建一个新阵列,但我不会在那里搜索。我不认为我可以避开第二阵列。

3 个答案:

答案 0 :(得分:0)

如果您认为此代码的迭代次数太多(您需要优化),您可能需要付出一些努力来对数据进行排序并将其组合成一个唯一值的数组。然后使用二分搜索。

答案 1 :(得分:0)

您可以使用正则表达式分割字符串

var a = ['amy', 'john', 'dev', 'garret', 'frank', 'sean', 'happy'];
var str = 'Amy test dev msg:(car runs slowly) happy   ...';
sort(a);
// Array a will look like below
// ["amy", "dev", "frank", "garret", "happy", "john", "sean"]

字符串是可排序的,因此您可以在中间拆分数组。如果在A部分中的字符串然后继续分割部分A,否则分开部分B.这将快速得到结果。

function search( arr, str ) {
    while ( arr.length > 1 ) {
        var m = Math.floor( arr.length / 2 );
        if ( str >= arr[m] ) {
            arr.splice( 0, m );
        } else {
            arr.splice( m );
        }
  }

  if ( arr[0] == str ) return true;
  return false;
}

答案 2 :(得分:0)

最简单,但同时最有用的优化是使用arr1arr2arr3的对象。这样您就可以使用arr1[word](或obj1更适合命名)而不是arr1.indexOf(word)。一般来说,前者的复杂性为O(1)(因为这是一个哈希表),后来是O(n)