Сортировка элементов по количеству
Всем привет!
Стало необходимо написать скрипт для сортировки элементов (div) по количеству. Например: Есть список названий.. <div class="tops">Сахар</div> <div class="tops">Сахар</div> <div class="tops">Молоко</div> <div class="tops">Огурцы</div> <div class="tops">Молоко</div> <div class="tops">Мед</div> <div class="tops">Огурцы</div> <div class="tops">Сахар</div> Необходимо подсчитать количество одинаковых продуктов и отсортировать их по убыванию. Получится: Так как сахара 3 шт. - 1-ое место. Так как молока 2 шт. - 2-ое место. Так как огурцов 2 шт. - 3-е место. Так как меда 1 шт. - 4-ое место. Максимальное количество выводимых продуктов - 5; <div class="tops">1. Сахар</div> <div class="tops">2. Молоко</div> <div class="tops">3. Огурцы</div> <div class="tops">4. Мед</div> Сколько уже на листочке алгоритмов не рисовал - не получается. Помогите. :( |
Покажите, как сопоставлены названия и количество.
|
FINoM,
В каком смысле? Вот написал скрипт... Только пока сортировки по кол. нету и ограничение на кол. HTML: <div style="display:none"> <div class="tAuthor">Сахар</div> <div class="tAuthor">Сахар</div> <div class="tAuthor">Молоко</div> <div class="tAuthor">Сахар</div> <div class="tAuthor">Мед</div> <div class="tAuthor">Сахар</div> <div class="tAuthor">Молоко</div> <div class="tAuthor">Сахар</div> <div class="tAuthor">Молоко</div> <div class="tAuthor">Огурцы</div> <div class="tAuthor">Мед</div> </div> <div class="twoss" title="Тут создается новый список"></div> JS:
$(function () {
$('.tAuthor').each(function(i){
var names = $(this).html();
var usi = $('.tAuthor2:contains('+names+')').html();
if(names!=usi) {
var aa = $('.tAuthor:contains('+names+')').length;
$('.twoss').append('<b class="tAuthor2">'+names+'</b>, '+aa+'<br>');
}
});
});
Помогите сортировку по убыванию, и макс кол. |
Лимит сделал
$(function () {
$('.tAuthor').each(function(i){
var names = $(this).html();
var usi = $('.tAuthor2:contains('+names+')').html();
var aa2 = $('.tAuthor2').length;
if(names!=usi && aa2<5) {
var aa = $('.tAuthor:contains('+names+')').length;
$('.twoss').append('<b class="tAuthor2">'+names+'</b>, '+aa+'<br>');
}
});
});
Осталось сортировку.. Как я понимаю, сейчас необходимо добавлять элементы через append и prepend. Если Больше макс. значения - prepend, а если меньше - append. |
Цитата:
|
Цитата:
- Делаешь массив типа
var a=[{Name: 'продукт', All: N}]
- вызываешь сортировку того массива
a.sort(function (a, b){b.All-a.All})
- Формируешь результирующий хтмл |
ksa,
Спасибо) Не могли бы Вы привести пример использования в данном случае? Вот изменил скрипт. Теперь все данные заносятся в массив. Как их теперь отсортировать? И удалить повторяющиеся? Читал про jQuery.unique, но не понял его применения.. А для сортировки, если прописать "array.sort(function (a, b){b.All-a.All})" - не работает.
$(function () {
var array = [];
$('.tAuthor').each(function(i){
var Name = $(this).html();
var NumRep = $('.tAuthor:contains('+Name+')').length;
var hash = {'Name': Name,'All': NumRep}
var rezArr = array.push(hash);
array.sort(function (a, b){b.All-a.All});
});
console.log(array)
});
|
Цитата:
В той теме много кто отписался своими вариантами... Ключевые коды я привёл... Остальное за оплату. :) |
Спасибо
|
var arr = ['Сахар','Сахар','Молоко','Огурцы','Молоко','Мед','Огурцы','Сахар'];
arr.sort();
var cur = arr[0];
var k = 1;
var tmp = {
'arr':[],
'hash':{},
'add':function(k,val){
if(!tmp.hash[k]){
tmp.hash[k] = [];
tmp.arr.push(k);
}
tmp.hash[k].push(val);
}
}
for(var i = 1; i < arr.length; i++){
if(arr[i] !== cur){
tmp.add(k,cur);
cur = arr[i];
k = 1;
}
else k++;
}
tmp.add(k,cur);
tmp.arr.sort(function(a,b){return b - a});
arr = [];
for(var i = 0; i < tmp.arr.length; i++)
for(var j = 0; j < tmp.hash[tmp.arr[i]].length; j++) arr.push(tmp.hash[tmp.arr[i]][j]);
delete cur;
delete k;
delete tmp;
alert(arr);
|
aiky,
Спасибо большое! Очень ВАМ БЛАГОДАРЕН! :thanks: |
aiky, спешу огорчить вас, оператор delete не удаляет переменные, только свойства.
|
Предложу такой вариант...
var a = ['Молоко','Огурцы','Молоко','Сахар','Сахар','Мед','Огурцы','Сахар'];
var i,b=[],c=[]
for (i=0; i<a.length; i++) {
b[a[i]]=(b[a[i]] || 0)+1
}
for (i in b) {
c[c.length]={
Name: i,
All: +b[i]
}
}
c.sort(function (a,b){return b.All-a.All})
for (i=0; i<c.length; i++) {
alert(c[i].Name+'='+c[i].All)
}
|
Цитата:
|
aiky,
как насчёт правильного варианта делать все переменные локальными? |
Вариант ...
<script type="text/javascript">
var a = ['Молоко','Огурцы','Молоко','Сахар','Сахар','Мед','Огурцы','Сахар'],
i, b = {},
c = [];
for (i = 0; i < a.length; i++) a[i] in b ? b[a[i]]++ : (b[a[i]] = 1, c.push(a[i]));
c.sort(function (d, e) {
return b[e] - b[d]
});
for (i = 0; i < c.length; i++) document.write(i + 1 + ". " + c[i] + "<br />");
</script>
|
Написал вариант, а потом увидел, что он почти совпадает с вариантом ksa. Ну, всё равно выложу (проструктурировал получше, да и вывод результатов удобнее):
var arr = ['Сахар','Сахар','Молоко','Огурцы','Молоко','Молоко','Молоко','Мед','Огурцы','Сахар'],
tmp_obj = {}, tmp_arr = [], i, l = arr.length;
//заполняем временный объект и подсчитываем количество
for (i = 0; i < l; i ++) tmp_obj[arr[i]] = (tmp_obj[arr[i]] || 0) + 1;
//превращаем временный объект в массив, чтоб сортировать
for (i in tmp_obj) tmp_arr.push([i, tmp_obj[i]])
tmp_arr.sort(function(a,b){return b[1] - a[1]});
alert(tmp_arr.join('; '))
|
Цитата:
|
Kolyaj,
вам действительно надо объяснить подробно, что именно я сделал? Или ваш вопрос - обычная вежливость, не требующая ответа? |
stopkran,
Во, все-таки кириллицу возможно в ключах использовать, не решился. Так гораздо все проще. |
aiky,
наверное, все тут сговорились вас огорчать :-), но всё-таки кириллицу в ключах лучше не использовать. У меня от этого были проблемы в Опере. Предположительно, этих проблем можно было бы избежать с помощью Юникод. Но наверняка я этого не знаю, поэтому решил проблему радикально - с помощью escape. В нашем случае можно делать примерно так:
var arr = ['Сахар','Сахар','Молоко','Огурцы','Молоко','Молоко','Молоко','Мед','Огурцы','Сахар'],
tmp = [], names = {}, out = '', l = arr.length, i = j = -1, k,
cmp = function(a, b) {return b[1] - a[1]},
add = function (name) {
//список уникальных имён
if (!(name in names)) names[name] = ++j
k = tmp[names[name]]
//пополняем массив сортировки (или количество в существующем элементе)
tmp[names[name]] = [k && k[0] || unescape(name), (k && k[1] || 0) + 1]
};
while (++i < l) add(escape(arr[i]))
tmp.sort(cmp)
alert(tmp.join('; '))
|
Цитата:
escape ...сурово |
Спасибо огромное за помощь!)))
|
| Часовой пояс GMT +3, время: 21:33. |