170k项目数组未正确处理

时间:2013-07-31 18:37:33

标签: javascript arrays knockout.js

我有fiddle(注意:通过JSONP访问近2k文件)。它在加载时有一个小单词列表,由两个和三个字母单词组成,它们被加载到一个数组中。然后使用Array.prototype.filter进行过滤。这很有效。

然后我的页面开始下载Enable1单词列表(大多数具有单词列表的游戏使用)。此时,我的过滤器函数最终得到一个空数组,而不是预期的105个单词。

我可以在之前和之后确认,

  • 我的单词列表具有相同的起始单词(aa),应显示
  • 这些名单分别有1091和172820个字
  • 所有单词均为小写,且没有周围空格
  • 在加载时,唯一的过滤标准是“只有两个字母”
  • 控制台上没有错误
  • Fiddle页面的RAM使用量增加了100mb(25%),我的系统剩余35%的RAM

这是我的代码。

function VM() {  
    var self = this;

    self.characters = ko.observable(2);

    self.words = ko.observableArray(document.getElementById("words")
        .innerHTML.split(/\s+/g).slice(1, -1)
        .map(function (word) {
        return word.toLowerCase();
    }));        

    self.possible = ko.computed(function () {
        var letters = self.letters(),
            starters = self.startsWith(),
            enders = self.endsWith(),
            characters = self.characters();

        return self.words().filter(function (word) {
            return word.length === parseInt(characters);
        })
            .filter(function (word) {
            if (enders === "") return true;

            for (var i = enders.length; i >= 0; --i) {
                if (word.slice(-1) === enders[i]) return true;
            }

            return false;
        })/* other filtering code */;

    });
}

ko.applyBindings(app = new VM);

$.getJSON('http://anyorigin.com/get?url=https://scrabble-dictionary-search.googlecode.com/svn-history/r6/trunk/src/main/resources/enable1.txt&callback=?', function(data){
    app.words(data.contents.split("\n"));
    console.log(app.words().length);
});

造成这种情况的原因是什么?如何让它与较小的列表一样工作?

1 个答案:

答案 0 :(得分:1)

我认为您的问题是当您“分割”您的ajax调用的结果时。如果您记录分割响应时获得的数组,您将看到类似的内容:“aa \ r”。

如果您使用:

app.words(data.contents.split("\r\n"));

而不是:

app.words(data.contents.split("\n"));

那会更好。