Единственный эффективный способ сделать то, что вам нужно, это справочная таблица (они могут стать сложными, прежде чем приступить к этому, проведите несколько тестов производительности - перечисленные здесь подходы поиска методом грубой силы могут подойти вам).
Основная идея заключается в том, что вы ведете список всех абзацев, где встречалось определенное слово. Итак, если «foobar» появился в пунктах 1, 2 и 7, мы бы хотели, чтобы следующее было верно:
myLookupTable["foobar"] = [1,2,7];
Если мы сделаем это для каждого слова в каждом параграфе, мы получим небольшой список.
Это основная идея:
var myHugeArray:Array = // fill your array data in here
var lookup:Object = {};
// Now we iterate through each item in your array and index all the words that we find
for (var idx:int in myHugeArray)
{
var par:String = myHugeArray[idx] as String;
par = par.replace(/['",.;:-()!?]/g, " "); // remove common punctuation
var words:Array = par.split(" "); // split the paragraph into specific words
for each(var word:String in words)
{
if(lookup[word] == undefined}
lookup[word] = [];
lookup[word].push(idx); // record the index of the paragraph that contained the word
}
}
// now do search for a word
var results:Array = lookup["foobar"];
if(results != null)
{
for each(var idx:int in results)
trace("Hit!", myHugeArray[idx]);
}
Теперь вам нужно обновлять таблицу поиска всякий раз, когда вы добавляете или удаляете элементы из массива (здесь не показано). Кроме того, вы можете создать «список остановок» из распространенных слов, таких как «the» и «a», которые не индексируются. Наконец, это только вернет точные совпадения для слов. Если вы хотите иметь возможность набирать «foob» и получать хиты для «foobar», вам нужно создать внутрисловные индексы, которые намного сложнее и требуют больше памяти.