在一组单词中搜索一个单词

时间:2014-12-18 07:31:14

标签: javascript arrays

我有一个由几个单词组成的数组,我找到了一个特定的单词。我目前的解决方案,如下所示,适用于小阵列。但是如果这个数组包含10,000个单词,那么我的解决方案需要大量的内存和CPU资源,因为它不够高效。 如何在性能方面使代码更好,并且在JavaScript中为大型数组占用更少资源?

var words = ['apple', 'orange', 'ananas', 'banana', 'mango', 'lemon', 'tomato'];

function search (term) {
  for (var i = 0, len = words.length; i < len; i++) {
    if (words[i] === term) {
      console.log(words[i] + ' is found at ' + i);
    }
  }
}

search('tomato');

3 个答案:

答案 0 :(得分:5)

使用单词作为键预填充字典(对象)。然后查找只是dict[term]

var words = ['apple', 'orange', 'ananas', 'banana', 'mango', 'lemon', 'tomato'];
var dict = {};

function prepopulate() {
    words.forEach(function(word, i) { dict[word] = i; });
}

function search (term) {
    if (term in dict) {
        console.log(term + ' is found at ' + dict[term]);
    }
}

prepopulate();
search('tomato');

答案 1 :(得分:2)

好吧,我不知道我是否遗漏了一些东西,但为什么你不能使用indexOf

function search (term) {
   console.log(term + " is found at " + words.indexOf(term));
}

答案 2 :(得分:0)

嗯,一致的答案是迭代数组的最快方法是with the very same for loop that you used,所以工作很顺利。但是,我made a jsPerf for this specific case和......

事实证明while循环更快!事实上,它似乎要快90%。不知道为什么会这样,但证据就在那里(至少在我的浏览器中)。当然,我假设如果你在数组中有多个值的实例,你会想知道 all 与它匹配的索引,而不仅仅是第一次出现,所以返回值是一个数组as好。无论如何,这是获胜的代码块:

//Note that I have 2 instances of tomato!
var words = ['apple', 'orange', 'tomato', 'ananas', 'banana', 'mango', 'lemon', 'tomato'];

//Gave the function two arguments to make it more generic
function search (arr, term) {
  var i, indices = [];
  while (i < arr.length) {
    if (arr[i] === term) {
      indices.push(i);
    }
    i++;
  }
  return indices;
}

search(words, 'tomato');