Как я могу индексировать массив объектов в Javascript быстрее? - PullRequest
1 голос
/ 30 июня 2011

Чтобы построить массив строк, необходимый для автозаполнения JQuery, я обхожу массив объектов и сливаю его в массив уникальных строк.Я делаю это примерно так, как вы могли бы ожидать:

var input = [{prop1:'value1', prop2: 'value2'}];

 $.each(input, function (index, value) {
                $.each(value, function (i, v) {
                    if (v != undefined && v != null && v != '' && ($.inArray(v, keywords) < 0)) {
                        keywords.push(v);
                    }
                });
            });

Проблема в том, что он плохо работает для больших наборов input и блокирует интерфейс во время работы.Как я могу сделать это лучше?

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

У вас там алгоритм O (n ^ 2).Просматривая этот массив ключевых слов снова и снова, вы получите действительно медленный (как вы заметили).

Вместо этого сохраняйте ключевые слова как объект:

var keywords = {};

    // ... inside your ".each():
    if (v && !keywords[v])
      keywords[v] = true;

Обратите внимание, что ваши тесты "v" для неопределенных, нулевых и пустых строк можно заменить, позволив JavaScript проверить правильность.Это не всегда правильная вещь, но здесь все в порядке.

Вы можете также держать ключевые слова в массиве, если хотите.Просто не ищите в массиве, чтобы определить, было ли ключевое слово еще замечено.

2 голосов
/ 30 июня 2011

Я думаю, что вы пытаетесь решить неправильную проблему

почему ваш список самовнушения настолько велик, что javascript работает плохо? просто отправьте 10 лучших автопредставлений клиенту, и все будет в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...