2016-08-12 6 views
1

フィルタリングされたユーザーリストにないユーザーを非表示にしようとしています。このため

、私はこのコード usersは、すべてのユーザーオブジェクトのリストであると filtered_usersがフィルタリングユーザーの電子メールのリストである

_.each(users, function (user) { 
    var display_type = filtered_users.hasOwnProperty(user.email)? "block" : "none"; 
    $("label[for='" + user.email + "']").css({"display":display_type}); 
}); 

を使用しています。 私は約1000人以上のユーザーからフィルタリングしています。そして、$("label[for='" + user.email + "']").css({"display":display_type})の操作に時間がかかりすぎているようです。

HTML:

<label class="checkbox" for="[email protected]"> 
    <input type="checkbox" name="user" value="[email protected]"> Cordelia Lear ([email protected]) 
</label> 
<label class="checkbox" for="[email protected]"> 
    <input type="checkbox" name="user" value="[email protected]"> Cordelia Lear ([email protected]) 
</label> 

誰かが$("label[for='" + user.email + "']").css({"display":display_type})の複雑さだかを説明することはできますか?それを即興化する方法はありますか?

+0

'.css()'はここでボトルネックにはなりません。あなたの 'users'リストはどれくらいですか? – Kemi

+0

約1000人以上のユーザー。 – kartikmaji

+0

いくつかのユーザーをhtmlで追加できますか? –

答えて

2

この$("label[for='" + user.email + "']")は、あなたを遅くする部分です。すべてのユーザーにとって、jqueryのシズルエンジンは、ページ内のすべてのラベルを調べ、正確なものを選択する必要があります。したがって、ユーザーo(n2)を反復するには少なくともo(n)* o(n)です。あなたは(あなたがfiltered_usersのために行うのと同じもの)後に電子メールでラベルのマップを作成し、Oで(1)、要素を検索し、表示を変更できることを解決するために

var usersMap = $('.users') 
 
    .find('label') 
 
    .toArray() 
 
    .reduce(function(map, user) { 
 
    var $user = $(user); 
 
    var email = $user.attr('for'); 
 
    map[email] = $user; 
 
    return map; 
 
    }, {}); 
 

 
var users = [ 
 
     { email: '[email protected]' }, 
 
     { email: '[email protected]'} 
 
     ]; 
 

 
var filtered_users = { '[email protected]': true }; 
 

 
users.forEach(function(user) { 
 
    var display_type = filtered_users.hasOwnProperty(user.email) ? "block" : "none"; 
 
    usersMap[user.email].css({ 
 
    "display": display_type 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="users"> 
 
    <label class="checkbox" for="[email protected]"> 
 
    <input type="checkbox" name="user" value="[email protected]">Cordelia Lear ([email protected]) 
 
    </label> 
 
    <label class="checkbox" for="[email protected]"> 
 
    <input type="checkbox" name="user" value="[email protected]">Cordelia Lear ([email protected]) 
 
    </label> 
 
</div>

関連する問題