Сортировка по внутреннему элементу
Вообщем суть такова, что получаю 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, время: 06:15. |