Каков наилучший способ фильтрации списка объектов JSON в JavaScript?
Предположим, у меня есть огромный (1000+) список объектов вроде этого:
[{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..]
Я хочу отфильтровать этот список по имени (символ мудрый).
filter('j') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..]
filter('jo') => [{name: 'john dow', age: 38, gender:'m'}, ..]
filter('dow') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..]
Каков наилучший способ сделать это? RegEx, очевидно, является одним из ключей, предварительно заказывая список, если предположить, что пользователь обычно имеет тенденцию начинать имена с самого начала, также может быть хорошей идеей, но в некоторых случаях это помогает.
Есть ли встроенные функции JavaScript для сопоставления фильтра? Я ожидаю, что они будут быстрее, чем реализации JavaScript.
P.S.: Да, я хочу фильтровать на стороне клиента из-за "автономных возможностей", которые я хочу предложить.
Ответы
Ответ 1
Хотя подстрочный индекс (например, дерево суффиксов ) сделает это быстрее, прямой поиск будет:
function (s, l) {
return l.filter(function (v) {
return v.name.find(s) !== -1;
});
}
где s
- строка запроса, а l
- список объектов.
Ответ 2
Из опыта, следующий алгоритм работает достаточно хорошо:
-
Когда пользователь вводит первую букву, вы выполняете поиск, используя Array.filter()
, возможно, и сохраняете этот результат под любым типом пользователя (например, "j" );
-
Когда пользователь вводит другую букву (например, "o" ), вы выполняете поиск по всему, что было напечатано до ( "j" ), уменьшая количество элементов, которые нужно пройти через
-
Когда пользователь удаляет один или несколько символов, вы пытаетесь найти сохраненные запросы на основе того, что осталось в окне поиска; если все не удается, вы показываете пустой список и аннулируете ранее сохраненные поисковые запросы.
Ответ 3
Я бы не стал слишком беспокоиться о производительности в этом случае. Настольный компьютер должен съедать 1000 или 10000 оценок без пота. Я бы избегал любой комплексной оптимизации, потому что риск нарушения функциональности, вероятно, выше, чем польза от небольшой эффективности обработки.
Javascript (ECMAScript 5) предоставляет новые методы фильтрации массивов. Как родной метод он должен быть немного быстрее.
var regex = ...
results = json.filter(function(result) {
return regex.test(result.name)
}
Array.prototype.filter поддерживается в современных браузерах, см. http://kangax.github.com/es5-compat-table/.
Патч для старых браузеров можно добавить следующим образом: https://github.com/kriskowal/es5-shim