我已经创建了一个数组,数组中的每个项目都是对某些内容的描述,大约20个字长,我想搜索数组,并返回包含特定单词的每个项目。
我发现的所有其他教程都基于循环搜索完全匹配。
谢谢!
答案 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);
}