ActionScript 3中数组indexOf无法找到已存在元素的问题求助
解决AS3中数组indexOf匹配失败的问题
看起来你的问题出在换行符残留的不可见字符上!当你用split(/\n/)分割文本时,如果原文件是Windows格式(换行符是\r\n),分割后的数组元素末尾会悄悄带上一个\r回车符。比如myArrayOfLines[2]实际是"ace\r",而不是你肉眼看到的"ace"——trace()输出时会忽略这个不可见字符,所以你误以为元素是纯"ace",但indexOf("ace")自然找不到完全匹配的项。
两种可行的解决方法,选一种就行:
方法1:用兼容所有换行格式的正则分割
把分割正则改成/\r?\n/,这样不管是Unix的\n还是Windows的\r\n都能正确分割,不会留下\r残留:
onLoaded(e:Event):void { // 兼容\r\n和\n的正则分割 var myArrayOfLines:Array = e.target.data.split(/\r?\n/); // 过滤文本末尾可能出现的空行 myArrayOfLines = myArrayOfLines.filter(function(item:String):Boolean { return item.length > 0; }); for(var t:Object in myArrayOfLines) trace(t + " : " + myArrayOfLines[t]); trace(myArrayOfLines.indexOf("ace")); // 现在应该返回预期的2了 trace(myArrayOfLines[2]); }
方法2:对每个数组元素做空白字符清理
如果文本里还可能存在空格、制表符等其他空白字符,可以对每个元素调用trim()去掉前后所有空白:
onLoaded(e:Event):void { var myArrayOfLines:Array = e.target.data.split(/\n/); // 遍历清理每个元素的前后空白 for(var i:int = 0; i < myArrayOfLines.length; i++){ myArrayOfLines[i] = myArrayOfLines[i].trim(); } // 过滤空行 myArrayOfLines = myArrayOfLines.filter(function(item:String):Boolean { return item.length > 0; }); for(var t:Object in myArrayOfLines) trace(t + " : " + myArrayOfLines[t]); trace(myArrayOfLines.indexOf("ace")); trace(myArrayOfLines[2]); }
验证问题的小技巧
你可以先打印元素的长度和转义内容,确认是否有隐藏字符:
trace("元素2的长度:" + myArrayOfLines[2].length); // 如果是4,说明带了\r("ace"本身长度是3) trace("转义后内容:" + escape(myArrayOfLines[2])); // 会显示ace%0D,%0D就是\r的转义码
这样就能彻底解决indexOf匹配失败的问题啦!
内容的提问来源于stack exchange,提问作者Michael Rize
相关产品推荐
相关产品推荐

