Как хранить и извлекать слова из словаря - PullRequest
1 голос
/ 07 декабря 2011

У меня есть переменная JavaScript, которая содержит массив слов словаря, таких как

var words = ['and','cat', n1, n2, n3 and so on ]

Этот массив содержит около 58020 слов.

Я создал автозаполненный плагин jQuery, который отображает слова из массива словаря в раскрывающемся списке, когда пользователь начинает вводить текст в текстовое поле. Но браузер падает в какой-то момент, потому что я думаю, что цикл по каждому слову замедляет процесс.

Как я могу преодолеть это?

Вот функция, которая проверяет массив слов и выводит слова, если они найдены

$(textInput).keyup(function(e) {

            var text = $(this).val();
            var foundTag = false;

            for (var i = 0; i < settings.tags.length; i++) {

                var tagName = settings.tags[i].toLowerCase();
                if (tagName.startsWith(text)) {

                    if (text != '') {
                        foundTag = true;
                        $(settings.tagContainer).append(GetDivDropDownItem(settings.tags[i]));
                    }
                    else {
                    }

                }

            }

        });

Редактировать

$(textInput).keyup(function(e) {

            var text = $(this).val();
            var foundTag = false;

            for (var i = 0; i < settings.words.length; i++) {

                var tagName = settings.words[i].toLowerCase();
                if (tagName.startsWith(text)) {

                    if (text != '') {
                        foundTag = true;
                        $(settings.tagContainer).append(GetDivDropDownItem(settings.words[i]));
                    }
                    else {
                    }

                }

            }

        });


var GetDivDropDownItem = function(text) {

        var cWidth = $(container).css("width");
        cWidth = cWidth.split("px")[0];

        var tag = $("<div/>");
        $(tag).css("paddingLeft", "5px");
        $(tag).css("paddingRight", "5px");
        $(tag).css("paddingBottom", "5px");
        $(tag).css("paddingTop", "5px");
        $(tag).css("width", cWidth - 10);
        $(tag).css("float", "left");

        $(tag).css("fontFamily", "Arial");
        $(tag).css("fontSize", "12px");
        $(tag).css("color", "#6A6B6C");
        $(tag).text(text);

        return $(tag);

    };

Ответы [ 5 ]

3 голосов
/ 07 декабря 2011

См. Этот тест и сравнение, выполненные создателем jQuery Джоном Резигом:

http://ejohn.org/blog/revised-javascript-dictionary-search/

По сути, ответом является простая трехблочная структура, если вы действительно хотите сделать это чисто JS.

3 голосов
/ 07 декабря 2011

Вы должны использовать лучшие структуры данных и алгоритмы.В общем, я бы предложил провести некоторое исследование уже существующей работы, прежде чем пытаться решить какую-либо проблему.

Эта статья может быть полезна: http://orion.lcg.ufrj.br/Dr.Dobbs/books/book5/chap08.htm

2 голосов
/ 07 декабря 2011

Структура данных Trie будет полезна для словаря.

2 голосов
/ 07 декабря 2011

Не помещая 58 000 слов в массив Javascript.

Используйте веб-сервис, который содержит все слова словаря в базе данных, и запросите его.


edit: Если вы действительно настаиваете на сохранении этого в массиве javascript, сгруппируйте слова по первым двум символам. Легко внедрить и уже в 600 раз быстрее.

1 голос
/ 07 декабря 2011

Предполагая, что settings.tags является массивом словарных слов, этот код будет очень громоздким, поскольку вы проходите цикл по массиву весь с каждым событием keyup.

Я бы посоветовал вам организовать слова слов в структуре, которая позволяет очень быстро переходить к словам.Возможно, двоичное дерево или просто ассоциативный массив.

...