You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:46