0

サーバーからバックボーン コレクションに初期データをロードしています。サーバーへの AJAX 呼び出しを起動し、キーアップごとに解析された JSON を返す検索入力を設定しました。

代わりに、検索をクライアント側のみにしたいと思います。これまでのところ、このコードを設定しました (関数は #search 入力のキーアップで発生します):

todos は backbone.marionette コレクションです

$('.content-search').on('keyup', '#search', function(e){
    e.preventDefault();
    var search = $('#search').val().toLowerCase();
    todos.update(initialData.todos);
    var json = todos.toJSON();
    var filteredJSON = filterJSON(json, search);
    dcis.update(filteredJSON);
}

function filterJSON(arr, part) {
    return arr.filter(function(obj) {
        return Object.keys(obj)
            .some(function(k) {
                console.log(obj[k]);
                if(typeof(obj[k]) == 'string'){
                    return obj[k].toLowerCase().indexOf(part) !== -1;
                }
            });
    });
};

それはひどく遅いです。実際には、クライアント側でフィルタリングを行うよりも、AJAX 呼び出しでサーバーを呼び出す方が高速でした。

私のコードがとても遅い理由は何ですか? JSON は非常に大きい (500 以上のエントリ)

4

1 に答える 1