вопрос по 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, время: 10:39. |