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

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

warren buffet 03.08.2016 12:08

В будущем когда source.assign(target) получит законную силу, перепишешь свой скрипт на одну строку

messages.assign(json);

https://developer.mozilla.org/ru/doc.../Object/assign

warren buffet 03.08.2016 12:10

Вложений: 1
рони, не надо картинок постить, у меня с двача лягушек на мегабайт.

warren buffet 03.08.2016 12:12

Цитата:

Сообщение от KupueIIIKo
sort(compareNumeric)

Как это слетают? Показывай свои коды, короче, если хочешь выйти на современный уровень программирования.

KupueIIIKo 03.08.2016 12:28

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();
}

Я думаю пойдет для начала)

warren buffet 03.08.2016 12:36

Для начала посмотри, что получается, если переписать твою пушнину нормальным языком

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,
		
		}
		
	}
	
}


То есть это не все, просто я хочу чтобы ты сам допер, как все просто.

warren buffet 03.08.2016 12:39

То есть, если в answer нет ничего лишнего или оно не помешает, то пушнина вырождается в

function pushMessages(data){

	for(var i=0;i<data.length;i++)
		messages[data[i].id] = data[i];
	
}


Сравни код выше с тем, который я постил от балды и найди отличия. ))) И все что тебе не хватает - это id сразу в выдаче с сервера, о чем я сразу же на капу и нажал.

KupueIIIKo 03.08.2016 12:43

Цитата:

Сообщение от warren buffet (Сообщение 424212)
Для начала посмотри, что получается, если переписать твою пушнину нормальным языком

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,
		
		}
		
	}
	
}


То есть это не все, просто я хочу чтобы ты сам допер, как все просто.

стиль написания не важен главное работоспособность) ну если тока сэкономить сотню байт при передаче данных

KupueIIIKo 03.08.2016 12:44

Цитата:

Сообщение от warren buffet (Сообщение 424213)
То есть, если в answer нет ничего лишнего или оно не помешает, то пушнина вырождается в

function pushMessages(data){

	for(var i=0;i<data.length;i++)
		messages[data[i].id] = data[i];
	
}


Сравни код выше с тем, который я постил от балды и найди отличия. ))) И все что тебе не хватает - это id сразу в выдаче с сервера, о чем я сразу же на капу и нажал.

тут у тебя id дублируется 2 раза)

warren buffet 03.08.2016 12:45

Допустим ты отрендерил ленту по полученным данным и пришли новые. Так ты просто заменяй messages на answer, то есть в калбеке аякса messages = answer и сразу на рендер.

warren buffet 03.08.2016 12:47

Цитата:

Сообщение от KupueIIIKo
тут у тебя id дублируется 2 раза)

То есть твой баттхерт выдал взаимоисключающие параграфы в пределах одной страницы форума:

Цитата:

Сообщение от KupueIIIKo
ну если тока сэкономить сотню байт при передаче данных

Вот теперь иди проси рони исправить твои колхозные коды. Я с "питекантропами" не общаюсь.

warren buffet 03.08.2016 12:48

id не дублируется умнег, а сохраняется. Оно никому не мешает лежа внутри объекта как лежало, поскольку при доступе к элементу по динамически вычисляемому ключу ты НЕ узнаешь id, ибо объект НЕ знает про своего родителя, а когда все в нем - бери что хочешь. Теперь уже иди экономь байты на убивании id.

warren buffet 03.08.2016 12:55

Это господа наше фсе. Рюзга когда узнает как надо, не радуется "А, так вот оно как, ну классно", а горюет "А за что я кровь проливал" и жалко ему становится своего говнокода. Тайком может быть исправит немного, скрепя сердце и скрипя извилинами покиляет часть, но не все, ибо если кодов мало, то нет морального удовлетворения. Это об анальной фиксации читайте у Фрейда.

KupueIIIKo 03.08.2016 13:44

Цитата:

Сообщение от warren buffet (Сообщение 424222)
Это господа наше фсе. Рюзга когда узнает как надо, не радуется "А, так вот оно как, ну классно", а горюет "А за что я кровь проливал" и жалко ему становится своего говнокода. Тайком может быть исправит немного, скрепя сердце и скрипя извилинами покиляет часть, но не все, ибо если кодов мало, то нет морального удовлетворения. Это об анальной фиксации читайте у Фрейда.

:agree: Я не ругаюсь и не критикую. Просто сказал, что пришло в голову. Если в JS связи между переменной и названием построены так же то это нечего печально. Оптимизация кода после запуска хотя бы рабочего кода

warren buffet 03.08.2016 16:38

У тебя просто подгорело, когда ты понял, что вся эта каша с переливанием пропертей вообще не нужна. Типа а-чо-такова что дохера лишних кодов, подумаешь там несколько десятков байт уедут, но анальная фиксация дала знать - оставленный 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]);


Потому что "модель" уже сделана на сервере.

warren buffet 03.08.2016 16:45

Почему нормализовать и приводить в порядок лучше на сервере. Потому что затраты на запуск треда, пехепе или какой там привод - просто несоизмеримы с тем, что затем делается этими скриптами и модулями. Это все равно что поднять пятиэтажный дом и волноваться о коробке чая оставленного на кухне, типа она создаст лишний вес. Когда ты попал в серверный скрипт - можешь там резвиться до посинения. Ты посмотри как прославленные фрейморки устроены изнутри. Жаба - для рендера. Какие-то там модели и прочая тряхомудия - чисто культура, чистого 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.