вопрос по jSon + Ajax
У меня к эвенту привязан ajax запрос.
Как получить ответ в виде массива, а не строки? Возможно ли вообще? На данный момент парсить прилетевшую строку единственный вариант для меня. Заранее спасибо. |
По протоколу http можно передавать только строки. JSON
|
Ясно, тогда остается только парсить строку.
Не подскажете, как в яваскрипте удалять последнюю ячейку в массиве? |
Цитата:
Цитата:
|
Большое спасибо.
|
Еще вопросик небольшой. Какая альтернатива php функции in_array в яваскрипте?
|
Метод indexOf у массивов, но он отсутствует в IE, но его можно там создать.
|
var i = 0; while(i < m['mcount']) { for(var i2=0;i2 < all_lat.length;i2++){ if(m['lat'][i] == all_lat[i2]){ m['lat'][i].splice(i2,1); m['lng'][i].splice(i2,1); } } i++; } Пишет ошибку: m.lat[i].splice is not a function Я сканирую многомерный массив, чтобы удалить уже существующие в нем ячейки данных. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
if(m['mcount'] > 0) { while(i < m['mcount']) { for(var i2=0;i2 < all_lat.length;i2++){ console.log(m); if(m['lat'].length > 0) { if(m['lat'][i] == all_lat[i2]){ m['lat'][i].splice(i,1); m['lng'][i].splice(i,1); } } } i++; } } Object lat=[2] lng=[2] mcount=2 Lat: ["56.50097598931345", "56.49983904637648" 0=56.50097598931345 1=56.49983904637648] |
Что самое интересное, ошибка происходит, только на первом эвенте, а потом все повторы проходят без ошибок.
|
Цитата:
|
А как тогда правильно обратиться к данным?
Я не особо дружу с яваскриптом, так что с объектами еще не умею обращаться. var m = {"lat": lat,"lng": lng,"mcount": data1[2]}; Как правильно создать многомерный массив в моем случае, если lat и lng возможно будут массивами в прилетевшем ответе. var m = []; m.push(lat); m.push(lng); m.push(data1[2]); Так будет правильно? *Вроде разобрался* Только не понял, как обращаться к данным ассоциативного массива/объекта. |
Цитата:
Цитата:
var a = {a: 1, b: 2}; alert(a.a); |
Цитата:
|
try to guess ;)
|
var allmakers = []; var all_lat = []; var all_lng = []; var all_lat_length = 0; var all_lng_length = 0; function insert_marker(lat,lng){ all_lat.push(lat); all_lng.push(lng); all_lat_length++; all_lng_length++; var mark = new GMarker(new GLatLng(lat,lng)); allmakers.push(mark); } function process_markers(m) { console.log(allmakers); if(all_lat_length > 0) { var i = 0; var rounds = m[2]; if(m[2] > 1) { while(i < rounds){ var i2 = 0; while(i2 < all_lat_length) { if(m[0][i] == all_lat[i2]){m[0].splice(i,1);m[1].splice(i,1);m[2]--;} i2++; } i++; } } else { var i2 = 0; while(i2 < all_lat_length) { if(m[0] == all_lat[i2]){m[0] = '';m[1] = '';m[2]--;} i2++; } } } 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]);} if(m[2] > 0) {mgr.addMarkers(allmakers,13);mgr.refresh();} } function get_and_set(sw_lat,sw_lng,ne_lat,ne_lng){ $.ajax({ url: "c4.php", type: "POST", data: "swlat=" + sw_lat + "&swlng=" + sw_lng + "&nelat=" + ne_lat + "&nelng=" + ne_lng, success: function(data){ if(data != "empty") { var data1 = (data).split("*"); if(data1[2] > 1) { var lat = (data1[0]).split("|");var lng = (data1[1]).split("|"); lat.pop(); lng.pop(); } else { var lat = data1[0]; var lng = data1[1]; } var m = []; m.push(lat); m.push(lng); m.push(data1[2]); process_markers(m); } } }); } var s_sw_lat = s_sw.lat(); var s_sw_lng = s_sw.lng(); var s_ne_lat = s_ne.lat(); var s_ne_lng = s_ne.lng(); var mgrOptions = {borderPadding: 25}; var mgr = new MarkerManager(map,mgrOptions); get_and_set(s_sw_lat,s_sw_lng,s_ne_lat,s_ne_lng); GEvent.addListener(map, "dragend", function() { var after_bounds = map.getBounds(); var a_sw = after_bounds.getSouthWest(); var a_ne = after_bounds.getNorthEast(); var a_sw_lat = a_sw.lat(); var a_sw_lng = a_sw.lng(); var a_ne_lat = a_ne.lat(); var a_ne_lng = a_ne.lng(); get_and_set(a_sw_lat,a_sw_lng,a_ne_lat,a_ne_lng); }); К карте привязан listener, то есть, после перетаскивания карты, проверяются вытащенные из базы маркеры с уже теми, что есть на карте и удаляются те, которые уже есть на карте. Оставшиеся в массиве маркеры, если такие будут, наносятся на карту и добавляются в общий массив маркеров. Только вот проблема в том, что при перетаскивании иногда происходит вот такое, хотя в базе координат всего на 5 маркеров: screenshot У меня почему то проскакивает m[2] в виде единицы, хотя должен быть 0, если на карте уже есть такой маркер. Помогите пожалуйста разобраться, где я ошибся. Может в скрипте присутствуют лишние вычисления? Если да, то как их сократить? |
если четсно, нету желания в таком коде разбираться... приведи пример данных, которые приходят в success
|
![]() В данном случае на карте было уже два маркера, подгрузились три маркера, из которых должен был добавиться в 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]);} |
Если в базе новых координат этой области не обнаружено, то 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]);} |
function insert_marker(lat,lng){ all_lat.push(lat); Добавление в общий массив координат, которые уже на карте. |
значит, сервер возвращает некоторое количество пар чисел (координат)? Давай переделаем это на json_encode + eval
|
Переделал, теперь ответ приходит такой:
{"lat":["56.50097598931345","56.49983904637648"],"lng":["21.01032257080078","20.999422073364258"],"mcount":2} А дальше как? :) Как заставить эту строку, воспринимать, как объект/массив. Я так понимаю, что вот таким способом: var obj= eval("(" + data+ ")"); |
Цитата:
lat, lng - названия координат? mcount - количетсво координат? тогда оно лишнее |
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. :( |
Цитата:
lng - longtitude mcount - affected_rows(); из последнего запроса Как проще сделать сравнение списка текущих координат и списка новых? |
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. Почему так? |
Эх, никто не хочет разбираться в коде. :D
В общем кое как сделал, вроде работает всё, только вот почему undefined, после прогона через array_diff, так и не разобрался. Теперь бы еще сделать сравнения видимой зоны и той, что будет, после dragend. А то на каждый dragend евент делать запрос к базе, то так и сервер загнется. :D |
Цитата:
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']--;} |
Сейчас выложу кусок кода, где сравнения производятся.
|
Цитата:
|
а вообще, я бы принимал массив вида
[{"lat":"56.50097598931345","lng":"21.01032257080078"},{"lat":"56.49983904637648","lng":"20.999422073364258"}] и заменил вот этот код на for( var i=0; i<markers.length; i++ ) for( var j=0; j<allMarkers.length; j++ ) if( markers[i].lat == allMarkers[j].lat && markers[i].lng == allMarkers[j].lng ) { markers.splice( i, 1 ); i--; break; } for( var i=0; i<markers.length; i++ ) insertMarker( markers[i] ); allMarkers = allMarkers.concat( markers ); |
// all_lat это общий массив широт(latitude), которые уже на карте //m[] это данные из ответа сервера console.log(all_lat); = ["56.50097598931345", "56.49983904637648"] console.log(m['lat']); = ["56.50097598931345", "56.53734016907318", "56.49983904637648"] newlat = array_diff(m['lat'],all_lat); newlng = array_diff(m['lng'],all_lng); // вот это в firebug выдает, при появлении на карте трех маркеров, из которых 1 новый console.log(newlat); = [undefined, "56.53734016907318"] // newlat это массив широт для новых маркеров на карте |
Цитата:
Можете объяснить? |
Цитата:
|
Цитата:
Теперь хочу реализовать проверку зон, из которых маркеры уже вытаскивались из базы. Только вот как бы это реализовать, чтобы не было "слепых зон","пустых зон". |
Цитата:
а я бы (если записей станет больше) {"head":["lat", "lng"], "rows":[["56.50097598931345", "21.01032257080078"],["56.49983904637648", "20.999422073364258"]]} Компактней, можно читабельные имена полей задавать, без ущерба для траффика. |
Цитата:
e1f, пожалуй +1 :) |
Часовой пояс GMT +3, время: 12:40. |