Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сортировка по внутреннему элементу (https://javascript.ru/forum/misc/64321-sortirovka-po-vnutrennemu-ehlementu.html)

KupueIIIKo 03.08.2016 10:35

Сортировка по внутреннему элементу
 
Вообщем суть такова, что получаю JSON c личными сообщениями, и загоняю их в переменную messages.
Получается в messages[0] есть свой id например 5.
Получается в messages[1] есть свой id например 10.
Все хорошо когда приходят первые данные, потом юзер решил догрузить сообщений, пришла еще пачка сообщений. Например часть новых, и часть старых

Так вот мне нужно отсортировать массив messages по внутреннему элементу id) Про sort знаю, может без написания есть какая-нибудь функция?

Или все таки прогонять весь массив сообщений, и сверять что есть на экране, а чего нет чтоб добавлять?) Я планировал дергать первый и последний ID) Мол если этот ID меньше значит староее сообщение добавляем к старым, если больше добавляем к новым) Опять же у них должен быть порядок, поэтому скорее всего сортировка)

рони 03.08.2016 11:19

KupueIIIKo,
фильтрация нужна а не сортировка --- нужен обьект для id -- нет id в обьекте выводим сообщение, записываем id в обьект и всё

KupueIIIKo 03.08.2016 11:27

Цитата:

Сообщение от рони (Сообщение 424171)
KupueIIIKo,
фильтрация нужна а не сортировка --- нужен обьект для id -- нет id в обьекте выводим сообщение, записываем id в обьект и всё

Я Вас прявильно понял вы предлагаете сделать messages[ID] - объектом, внутри которого хранятся текст и прочие данные?

warren buffet 03.08.2016 11:46

Да тут понимать нечего, отправляй данные сразу в ассоциативном массиве, чтобы получить нормальный объект в скрипте, тогда сможешь все сливать и переливать без проблем. То есть не надо на клиенте разбирать барахло, надо сразу отгрузить нормально. Это если можешь переписать серверный скрипт. Если не можешь, втыкай в объект массивы, то есть да

messages = {};
/* потом */
messages[id] =

Тогда

if(id in messages)


или снова

messages[id] =

То есть у тебя будет "карта" с ключами. На js нет ассоциативных массивов, но все юзают объекты. Ключ может быть вообще любым, в том числе и таким messages['первое сообщение'],

рони 03.08.2016 11:47

Цитата:

Сообщение от KupueIIIKo
Я Вас прявильно понял

нет
var obj = {};
messages.forEach(function(mes) {
      if(!obj[mes.id]){
       show(mes);
       obj[mes.id]=true
      }
});

warren buffet 03.08.2016 11:57

Цитата:

Сообщение от рони
нет

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

Короче, ТС, пока не нарисовал чудовищное количество циклов, переделывай выдачу с сервера или на клиенте переделывай messages в объект.

warren buffet 03.08.2016 12:01

То есть у тебя сейчас приходит массив с объектами или массивами, то загрузка такая

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];


Заметил разницу? Все очень просто.

рони 03.08.2016 12:03

warren buffet,

KupueIIIKo 03.08.2016 12:04

Цитата:

Сообщение от warren buffet (Сообщение 424189)
То есть у тебя сейчас приходит массив с объектами или массивами, то загрузка такая

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];


Заметил разницу? Все очень просто.

Я так и делаю) после .sort(compareNumeric) у меня все id-шники слетают

KupueIIIKo 03.08.2016 12:06

Судя по всему без цикла проверки никак(((


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