Сортировка по внутреннему элементу
Вообщем суть такова, что получаю JSON c личными сообщениями, и загоняю их в переменную messages.
Получается в messages[0] есть свой id например 5. Получается в messages[1] есть свой id например 10. Все хорошо когда приходят первые данные, потом юзер решил догрузить сообщений, пришла еще пачка сообщений. Например часть новых, и часть старых Так вот мне нужно отсортировать массив messages по внутреннему элементу id) Про sort знаю, может без написания есть какая-нибудь функция? Или все таки прогонять весь массив сообщений, и сверять что есть на экране, а чего нет чтоб добавлять?) Я планировал дергать первый и последний ID) Мол если этот ID меньше значит староее сообщение добавляем к старым, если больше добавляем к новым) Опять же у них должен быть порядок, поэтому скорее всего сортировка) |
KupueIIIKo,
фильтрация нужна а не сортировка --- нужен обьект для id -- нет id в обьекте выводим сообщение, записываем id в обьект и всё |
Цитата:
|
Да тут понимать нечего, отправляй данные сразу в ассоциативном массиве, чтобы получить нормальный объект в скрипте, тогда сможешь все сливать и переливать без проблем. То есть не надо на клиенте разбирать барахло, надо сразу отгрузить нормально. Это если можешь переписать серверный скрипт. Если не можешь, втыкай в объект массивы, то есть да
messages = {}; /* потом */ messages[id] = Тогда if(id in messages) или снова messages[id] = То есть у тебя будет "карта" с ключами. На js нет ассоциативных массивов, но все юзают объекты. Ключ может быть вообще любым, в том числе и таким messages['первое сообщение'], |
Цитата:
var obj = {}; messages.forEach(function(mes) { if(!obj[mes.id]){ show(mes); obj[mes.id]=true } }); |
Цитата:
Короче, ТС, пока не нарисовал чудовищное количество циклов, переделывай выдачу с сервера или на клиенте переделывай messages в объект. |
То есть у тебя сейчас приходит массив с объектами или массивами, то загрузка такая
var messages = {}; for(var i=0; i<json.length;i++) messages[json[i].id]=json[i]; А теперь смотри как будет выглядеть обновление for(var i=0; i<json.length;i++) messages[json[i].id]=json[i]; Заметил разницу? Все очень просто. |
warren buffet,
![]() |
Цитата:
|
Судя по всему без цикла проверки никак(((
|
В будущем когда source.assign(target) получит законную силу, перепишешь свой скрипт на одну строку
messages.assign(json); https://developer.mozilla.org/ru/doc.../Object/assign |
Вложений: 1
рони, не надо картинок постить, у меня с двача лягушек на мегабайт.
|
Цитата:
|
function getMessages(){ if(messages.length===0){ $.ajax({ type: 'post', data: 'getMessages', cache: false, dataType: 'json', success: function(answer){ pushMessages(answer); }, }); }else{ //Если не первая загрузка добавляем в ajax новую переменную. } } function pushMessages(answer){ for(var i=0;i<answer.length;i++){ messages[answer[i].id] = new Object(); messages[answer[i].id].text = answer[i].text; messages[answer[i].id].time = answer[i].time; messages[answer[i].id].sender = answer[i].sender; } updateMessages(); } Я думаю пойдет для начала) |
Для начала посмотри, что получается, если переписать твою пушнину нормальным языком
function pushMessages(data){ var row; for(var i=0;i<data.length;i++){ row=data[i]; messages[row.id] = { id:row.id, text:row.text, time:row.time, text:sender.sender, } } } То есть это не все, просто я хочу чтобы ты сам допер, как все просто. |
То есть, если в answer нет ничего лишнего или оно не помешает, то пушнина вырождается в
function pushMessages(data){ for(var i=0;i<data.length;i++) messages[data[i].id] = data[i]; } Сравни код выше с тем, который я постил от балды и найди отличия. ))) И все что тебе не хватает - это id сразу в выдаче с сервера, о чем я сразу же на капу и нажал. |
Цитата:
|
Цитата:
|
Допустим ты отрендерил ленту по полученным данным и пришли новые. Так ты просто заменяй messages на answer, то есть в калбеке аякса messages = answer и сразу на рендер.
|
Цитата:
Цитата:
|
id не дублируется умнег, а сохраняется. Оно никому не мешает лежа внутри объекта как лежало, поскольку при доступе к элементу по динамически вычисляемому ключу ты НЕ узнаешь id, ибо объект НЕ знает про своего родителя, а когда все в нем - бери что хочешь. Теперь уже иди экономь байты на убивании id.
|
Это господа наше фсе. Рюзга когда узнает как надо, не радуется "А, так вот оно как, ну классно", а горюет "А за что я кровь проливал" и жалко ему становится своего говнокода. Тайком может быть исправит немного, скрепя сердце и скрипя извилинами покиляет часть, но не все, ибо если кодов мало, то нет морального удовлетворения. Это об анальной фиксации читайте у Фрейда.
|
Цитата:
|
У тебя просто подгорело, когда ты понял, что вся эта каша с переливанием пропертей вообще не нужна. Типа а-чо-такова что дохера лишних кодов, подумаешь там несколько десятков байт уедут, но анальная фиксация дала знать - оставленный id тебе сразу бросился в глаза.
Короче, полюби уже себя, делай для себя как лучше, а лучше - это значит лучше, а не как получилось из-за незнания как делается. Делается вообще просто. На сервере формируешь массив и выдаешь его в json или xml браузеру, тот передает скрипту - втыкай и не надо молотить. Из БД получается индексный массив, ну так на сервере профтыкай в него идешники и все. Например на пехепе. $assoc=array(); $rows = $db->query('select * from `messages` where 1')->fetch_all(MYSQLI_ASSOC); /* или какой у тебя драйвер бд */ foreach($rows as $row) $assoc[$row['id']]=$row; echo json_encode($assoc); exit; В браузере просто сразу рендеришь, скажем var el; for(var id in json) if(el=wrapper.querySelector('#'.id)) edit_post(json[id]); /* а вот тут скажи мне брат, как edit_post() узнает про id, если его нет внутри объекта? Если id нет внутри, тебе придется передавать его как дополнительный аргумент фкнкции, а зачем? Понял зачем id внутри? */ else create_post(json[id]); Потому что "модель" уже сделана на сервере. |
Почему нормализовать и приводить в порядок лучше на сервере. Потому что затраты на запуск треда, пехепе или какой там привод - просто несоизмеримы с тем, что затем делается этими скриптами и модулями. Это все равно что поднять пятиэтажный дом и волноваться о коробке чая оставленного на кухне, типа она создаст лишний вес. Когда ты попал в серверный скрипт - можешь там резвиться до посинения. Ты посмотри как прославленные фрейморки устроены изнутри. Жаба - для рендера. Какие-то там модели и прочая тряхомудия - чисто культура, чистого MVC на жабе не надо вообще.
*Из БД получается индексный массив То есть ассоциативный, но с индексами рядов. Ключи в массивах менять нельзя, поэтому приходится переписывать из одного в другой. Premature optimization вопит про el=wrapper.querySelector(), тогда так for(var id in json) if(id in messages) /* старый массив */ edit_post(json[id]); else create_post(json[id]) messages=json; /* теперь новые данные стали старыми */ Одна процедура на всё. Если messages={}, то сработает только create_post() |
Часовой пояс GMT +3, время: 07:16. |