Javascript - 如何有效地搜索数组中的对象

时间:2013-06-13 15:32:27

标签: javascript arrays search case-insensitive

我需要在一个大型数组中找到一个对象(一个精确的字符串)。虽然下面的代码有效,但是通过粗略的方法滚动浏览数组的每个元素是非常繁琐的。有更有效的方法吗?可能会调用.search或.match或同等的?另外如何使搜索对象(字符串)不区分大小写?即,对象可能是“abc”,而数组元素是“ABC”。

非常感谢提前

function SearchArray(array, object){ //need to modify code to become case insensitive.
  for (var i= 1; i< array.length; i++){
    if (array[i] == object.toString()){ 
        return i; 
      } 
  }
  return 0;
}

我也忘了提到搜索返回一维数组中匹配对象的索引/位置,而不是简单的true / false。

2 个答案:

答案 0 :(得分:2)

以下功能就是这样:

function findWord(array, word) {
    return -1 < array.map(function(item) { return item.toLowerCase(); }).indexOf(word.toLowerCase());
}

它的作用是:

  • 使用map()函数将每个字符串转换为小写。
  • 也以小写模式搜索某个单词。
  • 如果找到该单词,则该函数返回大于-1的值,因此返回值为truefalse

答案 1 :(得分:1)

如果你只想搜索一次大数组,那么唯一可能的优化是存储对象字符串表示而不是在每次比较之前生成它:

function SearchArray(array, object) {
  var len=array.length, str=object.toString().toLowerCase();
  for (var i=0; i<len; i++) {
    if (array[i].toLowerCase() == str) { return i; }
  }
  return -1; // Return -1 per the "Array.indexOf()" method.
}

但是,如果您要在数组中搜索许多对象,那么您将通过存储元素的小写版本来节省时间:

var lowerArray = array.map(function(x){return x.toString().toLowerCase();});
var lowerObject = object.toString().toLowerCase();
lowerArray.indexOf(lowerObject); // Simply use "Array.indexOf()".

此外,如果您将多次搜索此数组,可用的内存充足,性能至关重要,那么您应该考虑使用O(1)查找对象:

function makeLowerCaseArrayIndexLookupFunction(array) {
  var lookup = array.reduce(function(memo, x, i) {
    memo[x.toString().toLowerCase()] = i;
    return memo;
  }, {});
  return function(obj) {
    var idx = lookup[obj.toString().toLowerCase()];
    return (typeof(idx)==='undefined') ? -1 : idx;
  }
}

var findWeekdays = makeLowerCaseArrayIndexLookupFunction([
  'Mon', 'Tues', 'Weds', 'Thurs', 'Fri', 'Sat', 'Sun'
]);
findWeekdays('mon'); // => 0
findWeekdays('FRI'); // => 4
findWeekdays('x'); // => -1