对于AS3来说,这有点新奇,所以如果这是一个简单的问题,请原谅。
我已经创建了一个数组,数组中的每一项都是对某事物的描述,大约20个单词长,我想搜索该数组,并返回包含特定单词的每一项。
我找到的所有其他教程都是基于循环来搜索精确匹配的。
谢谢!
发布于 2010-03-29 10:55:55
无论如何,您都需要遍历数组来查找匹配项。
也就是说,使用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“,并从filterArray()
中的searchTerm
中指向它。
发布于 2010-03-29 12:14:05
做你想做的事情的唯一有效的方法是查找表(在你开始之前,做一些性能测试,这可能会变得很复杂--这里列出的暴力搜索方法对你来说可能很好)。
基本思想是,您保留了一个列表,其中包含出现特定单词的所有段落。因此,如果"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”的命中结果,那么您需要创建词内索引,这要复杂得多,并且占用大量内存。
发布于 2010-03-29 11:10:42
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);
}
https://stackoverflow.com/questions/2535501
复制相似问题