AS3:连接数组并保存到文本文件正在创建空白条目

时间:2013-01-15 11:04:12

标签: arrays actionscript-3 air text-files filestream

我正在努力让我的数组正确保存到文本文件中。文本文件以每行一行的方式格式化,因此我使用它:

var newFavString:String = arFavourites.join("\r\n");

    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();

但在某个地方,不知何故,它会添加空行,这可能是由某些数组条目中的空格引起的,但这不应影响我不认为的加入过程。

我用它来清理数组以防万一它仍然在跟踪中显示一些未定义的对象:

for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
        trace(arFavourites[i]);
    }

这就是我将数据导入数组的方式:

var favFile:File = File.userDirectory;
favFile = favFile.resolvePath("favourites.txt");
var favStream:FileStream = new FileStream();

var arFavourites = new Array();
var FavCount:int = 0;

favStream.open(favFile, FileMode.READ);
var fileContents:String = favStream.readUTFBytes(favStream.bytesAvailable);


    arFavourites = fileContents.split("\r\n");

    for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
    }

favStream.close();

当我删除某些内容时,我会在数组中搜索它并拼接出来。也许错误就在那里。

var k:int;
    var i:int;
    trace("Selected Index: " + dg.selectedIndex);
    if (dg.length == 0) {
        return;
    }
    for (k=0; k<dg.length; k++) {
        if (dg.isItemSelected(dg.getItemAt(k))) {
            for (i=0; i<arFavourites.length; i++) {
                if (arFavourites[i] == dg.getItemAt(k)[1]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[2]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[3]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[4]) {
                    arFavourites.splice(i,1);
                    }
                if (arFavourites[i] == dg.getItemAt(k)[5]) {
                    arFavourites.splice(i,1);
                    }
            }
            dg.removeItemAt(k);
            dg.scrollToIndex(k);
            dg.clearSelection();
            break;
        }
    }
    for (i=0; i<arFavourites.length-1; i++) {
        if (arFavourites[i] == undefined) {
        arFavourites.splice(i,1);
        }
    }
    var newFavString:String = arFavourites.join("\r\n");
    trace(newFavString);

    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();

在数组中添加或删除某些内容时,会更新文本文件。 我确信它的东西非常简单,我非常感谢快速反应=) 感谢

2 个答案:

答案 0 :(得分:0)

这实际上不是从数组中过滤掉事物的方法(你做得既效率低又缺少一些):

private function test():void
{
    var tester:Array = [];
    tester[1] = 1;
    tester[2] = 2;
    tester[4] = 3;
    tester[6] = 4;
    // 1-2-3-4
    trace(removeEmptyElements(tester).join("-"));
}

public static function removeEmptyElements(array:Array):Array
{
    var result:Array = new Array(array.length);
    for (var i:int, j:int; i < array.length; i++)
        if (array[i] != undefined) result[j++] = array[i];
    result.length = j;
    return result;
}

这将是这样做的方法。您还希望合并if语句测试互斥条件(或getitemAt是否有副作用?)。否则它看起来更像是一个bug。

答案 1 :(得分:0)

好的,所以我终于想出了一个有效的解决方案。 通过获取selectedIndex,我可以找出哪个数组元素与dataGrid行匹配,然后将其拼接出来。

选定指数:

arFavourites.splice(dg.selectedIndex*5,5);

从DataGrid中删除行:

for (k=0; k<dg.length; k++) {
        trace(dg.length);
        if (dg.isItemSelected(dg.getItemAt(k))) {
            dg.removeItemAt(k);
            dg.scrollToIndex(k);
            dg.clearSelection();
        }}

重写文字文件:

var newFavString:String = arFavourites.join("\r\n");
    trace(newFavString);
    favStream.open(favFile, FileMode.WRITE);
    favStream.writeUTFBytes(newFavString);
    favStream.close();