1

我需要在一个大数组中找到一个对象(准确地说是一个字符串)。虽然下面的代码有效,但它在数组的每个元素中滚动,这是一种粗暴的方法。有没有更有效的方法?可能调用 .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;
}

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

4

2 回答 2

2

以下函数就是这样做的:

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

它的作用是:

  • map()使用该函数将每个字符串转换为小写。
  • 也在小写模式下搜索某个单词。
  • 如果找到该单词,则函数返回一个大于 -1 的值,因此返回值要么是true要么false
于 2013-06-13T15:45:18.063 回答
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
于 2013-06-13T16:25:51.100 回答