Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   вопрос по jSon + Ajax (https://javascript.ru/forum/events/5321-vopros-po-json-ajax.html)

Beck 05.10.2009 21:22



В данном случае на карте было уже два маркера, подгрузились три маркера, из которых должен был добавиться в marger manager один, а добавилось два.

Координаты одного маркера каким то способом проскочили проверку уже существующих маркеров в marker manager(на карте).


На данный момент код такой:

if(all_lat_length > 1) {
	var i = 0;
	var i2 = 0;
	
	if(m[2] > 1) {
		while(i < m[2]){		
		while(i2 < all_lat_length) {
			if(m[0][i] == all_lat[i2]){m[0].splice(i,1);m[1].splice(i,1);console.log(m[2]);m[2]--;console.log(m[2]);}
			i2++;
			}
		i++;
		}
	}
	if(m[2] == 1) {
		var i2 = 0;
		while(i2 < all_lat_length) {
			if(m[0] == all_lat[i2]){m[2] = 0;break;}
			i2++;
			}			
		}
	}		
	
		

	console.log(m[0]);
	console.log(m[1]);
	if(m[2] > 1) {	var i = 0;while(i < m[2]){insert_marker(m[0][i],m[1][i]);i++;}	}	
	if(m[2] == 1) {insert_marker(m[0],m[1]);}

Beck 05.10.2009 21:32

Если в базе новых координат этой области не обнаружено, то firebug должен выдавать такое:



Cтроки:

1) Прилетевший, не отпарсенный ответ
2) Количество непроверенных координат из прилетевшего ответа по отношению к уже существующим на карте
3) Количество непроверенных координат из прилетевшего ответа по отношению к уже существующим на карте
4) 0 совпадений найдено
5) Массив новых координат пуст
6) тоже, что и пятый пункт, просто перед самым добавлением проверяю:

console.log(m[2]);
	if(m[2] > 1) {	var i = 0;while(i < m[2]){insert_marker(m[0][i],m[1][i]);i++;}	}	
	if(m[2] == 1) {insert_marker(m[0],m[1]);}

Beck 05.10.2009 21:44

function insert_marker(lat,lng){
	
	all_lat.push(lat);


Добавление в общий массив координат, которые уже на карте.

x-yuri 05.10.2009 21:47

значит, сервер возвращает некоторое количество пар чисел (координат)? Давай переделаем это на json_encode + eval

Beck 05.10.2009 22:17

Переделал, теперь ответ приходит такой:

{"lat":["56.50097598931345","56.49983904637648"],"lng":["21.01032257080078","20.999422073364258"],"mcount":2}


А дальше как? :) Как заставить эту строку, воспринимать, как объект/массив.

Я так понимаю, что вот таким способом:

var obj= eval("(" + data+ ")");

x-yuri 05.10.2009 22:25

Цитата:

Сообщение от Beck
А дальше как? Как заставить эту строку, воспринимать, как объект/массив.

http://javascript.ru/forum/31724-post10.html - что непонятно?
lat, lng - названия координат?
mcount - количетсво координат? тогда оно лишнее

Beck 05.10.2009 22:49

if(all_lat_length > 1) {
	var i = 0;
	var i2 = 0;	

	if(m['mcount'] > 1) {
		while(i < m['mcount']){		
			while(i2 < all_lat_length) {
				if(m['lat'][i] == all_lat[i2] && m['lng'][i] == all_lng[i2]){m['lat'].splice(i,1);m['lng'].splice(i,1);m['mcount']--;}
				i2++;
				}
		i++;
		}
	}
	if(m['mcount'] == 1) {
		var i2 = 0;
		while(i2 < all_lat_length) {
			if(m['lat'] == all_lat[i2] && m['lng'] == all_lng[i2]){m['mcount'] = 0;}
			i2++;
			}			
		}
	}		
	

	
	if(m['mcount'] > 1) {	var i = 0;while(i < m['mcount']){insert_marker(m['lat'][i],m['lng'][i]);i++;}	}	
	if(m['mcount'] == 1) {	insert_marker(m['lat'],m['lng']);	}
	console.log(mcnt);


console.log(mcnt); должно выводить три, а выводит 4. :(

Beck 05.10.2009 22:51

Цитата:

Сообщение от x-yuri (Сообщение 31785)
http://javascript.ru/forum/31724-post10.html - что непонятно?
lat, lng - названия координат?
mcount - количетсво координат? тогда оно лишнее

lat - latitude
lng - longtitude

mcount - affected_rows(); из последнего запроса

Как проще сделать сравнение списка текущих координат и списка новых?

Beck 05.10.2009 23:39

if(all_lat_length > 1) {	
	newlat = array_diff(m['lat'],all_lat);newlng = array_diff(m['lng'],all_lng);
	console.log(newlat);console.log(newlng);
	for(i = 1;i < newlat.length;i++){insert_marker(newlat[i],newlng[i]);} 
	}	
	else {
	if(m['mcount'] > 1) {	for(i = 0;i < m['lat'].length;i++)	{insert_marker(m['lat'][i],m['lat'][i]);}	} 
	else {insert_marker(m['lat'],m['lng']);}
	}
	console.log(mcnt);


Нашел функцию у вас на сайте:
function array_diff (array) {    // Computes the difference of arrays
    // 
    // +   original by: Kevin van Zonneveld ([url]http://kevin.vanzonneveld.net[/url])
 
    var arr_dif = [], i = 1, argc = arguments.length, argv = arguments, key, key_c, found=false;
 
    // loop through 1st array
    for ( key in array ){
        // loop over other arrays
        for (i = 1; i< argc; i++){
            // find in the compare array
            found = false;
            for (key_c in argv[i]) {
                if (argv[i][key_c] == array[key]) {
                    found = true;
                    break;
                }
            }
 
            if(!found){
                arr_dif[key] = array[key];
            }
        }
    }
 
    return arr_dif;
}

Прогнал через нее оба массива, вроде всё работает, но как доработать, чтобы сверять и широту и долготу одновременно.

И еще, почему-то в newlat нулевой слот стоит undefined, как и в newlng.
Почему так?

Beck 06.10.2009 15:36

Эх, никто не хочет разбираться в коде. :D

В общем кое как сделал, вроде работает всё, только вот почему undefined, после прогона через array_diff, так и не разобрался.

Теперь бы еще сделать сравнения видимой зоны и той, что будет, после dragend.

А то на каждый dragend евент делать запрос к базе, то так и сервер загнется. :D


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