2016-08-12 2 views
1

Я пытаюсь скрыть пользователей, не входящих в список фильтрованных пользователей.

Для этого я использую этот код

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

Где users находится список всех пользовательских объектов и filtered_users является список электронной почты отфильтрованных пользователей. У меня есть около 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()' не должно быть узким местом здесь. Как долго ваш список пользователей? – Kemi

+0

Около 1000 или более пользователей. – kartikmaji

+0

Можете ли вы добавить некоторых пользователей html? –

ответ

2

Этот номер $("label[for='" + user.email + "']") является частью, которая замедляет вас. Для каждого пользователя механизм jquery sizzle должен перебирать все метки на странице и выбирать точный, поэтому для итерации пользователей - o (n2) требуется не менее o (n) * o (n).

Чтобы решить, что вы можете создать карту этикетки на электронную почту один раз (то же самое, что вы делаете для filtered_users), а затем о (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>

Смежные вопросы