AS3 - 在每个项目为段落长时,搜索包含特定单词的项目的数组

时间:2010-03-29 02:33:50

标签: flash actionscript-3 arrays

如果这是一个直截了当的问题,那么请原谅我。请原谅我。

我已经创建了一个数组,数组中的每个项目都是对某些内容的描述,大约20个字长,我想搜索数组,并返回包含特定单词的每个项目。

我发现的所有其他教程都基于循环搜索完全匹配。

谢谢!

3 个答案:

答案 0 :(得分:4)

无论如何,你需要遍历数组才能找到匹配。

这就是说,使用String.search()方法来寻找你的单词:

var searchTerm:String = "whatever word you're looking for";
var foundItems:Array = new Array();

for each(var paragraph:String in paragraphArray) {
    if(paragraph.search(searchTerm) != -1) {
        foundItems.push(paragraph);
    }
}
return foundItems;

修改: 我使用以下代码进行了测试,似乎工作正常。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="filterArray()">
    <mx:Script>
        <![CDATA[
            private var arr:Array = ["a", "a b c", "c d e", "a d e", "z q aaa r"];
            private var searchF:String = "a";

            private function filterArray():void {
                var searchTerm:String = searchF;

                for each(var paragraph:String in arr) {
                    if(paragraph.search(searchTerm) != -1) {
                        trace('found: ' + paragraph);
                    }
                }
            }
        ]]>
    </mx:Script>
</mx:Application>

编辑#2 :我修改了上一个代码段,使其看起来更像您评论中的内容。我打破了“searchF”并从searchTerm中的filterArray()指出了它。

答案 1 :(得分:1)

执行所需操作的唯一有效方法是查找表(这些可能会变得复杂,在您开始执行此操作之前,请执行一些性能测试 - 此处列出的强力搜索方法可能适用于您)。

基本思想是保留一个特定单词出现的所有段落的列表。因此,如果第1段,第2段和第7段中出现“foobar”,我们希望以下内容成立:

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”的命中,那么你需要创建字内索引,这些索引要复杂得多且占用大量内存。

答案 2 :(得分:0)

filter

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html#filter%28%29

var myArray = ['aaa', 'bbb', 'cac'];
var needle = 'a';
trace( myArray.filter(array_search) );


function array_search(element:*, index:int, arr:Array):Boolean {
    return (element.indexOf(needle) > -1 ? true : false);
}