Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удалить все элементы с одинаковым значением атрибута тега (https://javascript.ru/forum/misc/65717-udalit-vse-ehlementy-s-odinakovym-znacheniem-atributa-tega.html)

karakym 04.11.2016 14:26

Удалить все элементы с одинаковым значением атрибута тега
 
Есть к примеру список <ul><li>...
у каждого <li> есть атрибут data-name
Так вот они могут и будут повторятся, мне нужно удалять дубликаты при этом оставлять один видимым.
Пробовал через css :not(:first-child) {display: none;
Но Если элемент не повторяется, то он тоже скрывается.
А мне нужно отобразить все просто дубликаты отсеять.
Как это сделать на jQuery ?

laimas 04.11.2016 14:41

А дубликаты откуда берутся, надо полагать сервер их поставляет, а сервер откуда их берет?

Aetae 04.11.2016 14:46

Как верно сказано выше, дубли должен отсеивать ещё сервер.

А так:
var list = Object.create(null);
$( 'li[data-name]' ).each(function(){
  var $li = $(this),
      name = $li.data('name');
  if(name in list) $li.css('display', 'none');
  else list[name] = true;
});

fuckingquest 04.11.2016 14:56

Цитата:

Сообщение от Aetae
Как верно сказано выше

а теперь представь себе такую картину. Допустим, операция занимает 1 секунду. За этой страницей обращается одновременно миллион клиентов.
В одном случае, у тебя процесс распараллелится по миллиону компов, а в другом -- клиенты будут ждать до посинения, в худшем случае, секунда*миллион времени.

Слегка утрировал, но суть та же.

Aetae 04.11.2016 15:00

fuckingquest, передача лишнего трафика и соответственно занятое соединение потратит больше времени чем фильтрация на сервере, тем более если отсеивать лишнее правильным запросом к бд.

laimas 04.11.2016 15:03

Цитата:

Сообщение от fuckingquest
В одном случае, у тебя процесс распараллелится по миллиону компов, а в другом -- клиенты будут ждать до посинения

Чего ждать? На каждого клиента свой процесс на сервере, а сколько он работает, это уже ваша забота, и если параметры списка определяют данные из базы, то кто же вас заставляет брать все, а не уникальные значения? Тоже самое если дубликаты не данные из базы, отсеять их, это не добавит очень много дополнительного времени, конечно если код сервера не корявый.
А слать мусор клиенту по принципу "да хрен с ним, процессоры сейчас мощные, памяти хватит, пусть карячится", это что подход? Ну так по такому принципу с сервера можно столько плюнуть на клиента, что завалится уже клиент.

fuckingquest 04.11.2016 15:28

laimas,
Цитата:

Сообщение от laimas
На каждого клиента свой процесс на сервере

то что оратор выше сказал, про траф, еще можно худо бедно всерьез воспринять, если забыть о скорости современных каналов, но то что Вы плетете -- это просто натуральная ахинея. Вы что же думаете, процессы бесплатны что-ли? Тем более в Вашем этом похапе, блеать, что они ресурс процессора не отжирают, или что тут Вы пытаетесь сказать я не понял?
При последовательной обработке первый будет ждать мало, последний много, с тредами все будут ждать среднебольничное, грубо говоря.

laimas 04.11.2016 15:43

Цитата:

Сообщение от fuckingquest
Тем более в Вашем этом похапе, блеать, что они ресурс процессора не отжирают, или что тут Вы пытаетесь сказать я не понял?

Любой процесс любого ПО это ресурсы, об этом можно и не говорить. Ждать кого и что значит последовательно - первый жрет мало, второй больше? Не кажется что вы несете ахинею или я не понял теперь о чем вы?

А работа на клиенте, это тоже ресурсы и о них тоже нужно думать.

fuckingquest 04.11.2016 15:46

Цитата:

Сообщение от laimas
или я не понял теперь о чем вы?

скорей: не мог изначально

karakym 04.11.2016 16:25

Цитата:

Сообщение от Aetae (Сообщение 434020)
Как верно сказано выше, дубли должен отсеивать ещё сервер.

А так:
var list = Object.create(null);
$( 'li[data-name]' ).each(function(){
  var $li = $(this),
      name = $li.data('name');
  if(name in list) $li.css('display', 'none');
  else list[name] = true;
});

Спасибо, помогло. Понимаю что сервер выполняет работу зря когда создает дубли и не обрабатывает их, но мне крайне важно, что бы они все были и просто скрыть дубли.


Часовой пояс GMT +3, время: 23:33.