2013-07-17 2 views
-1

Я получаю ответ json от моего веб-сервера на $ .getJSON. Это ответ:конвертировать json-ответ в массивы javascript

[{"id":"1","latitude":"28.63","longitude":"77.21","price":"0"},{"id":"2","latitude":"28.71","longitude":"77.19","price":"100"}] 

И это мой код Javascript, чтобы преобразовать этот ответ массивы:

var i = 0; 
var vehicleId = $('#selectVehicle option:selected').val(); 
$.getJSON('getFillingDetails.php', {id : vehicleId}, function(data){ 
    var lat = []; 
    var lon = []; 
    var price = []; 
    $.each(data, function(key, value){ 
     lat.push(value.latitude); 
     lon.push(value.longitude); 
     price.push(value.price); 
     i++; 
    }); 
}); 
console.log(i); 

Но когда я вижу значение I в консоли это не изменения. это все равно 0. Это означает, что внутри $.each() ничего не происходит. Я абсолютно не знаком с javascript. Любая помощь будет оценена.

+0

потому что это асинхронный запрос –

+0

Вашего код прекрасно работает в скрипке http://jsfiddle.net/tBUnz/ –

+2

@ArunPJohny его код находится внутри обратного вызова' $ .getJSON'. –

ответ

1

Попробуйте это:

var i = 0; 
var vehicleId = $('#selectVehicle option:selected').val(); 
$.getJSON('getFillingDetails.php', {id : vehicleId}, function(data){ 
    var lat = []; 
    var lon = []; 
    var price = []; 
    $.each(data, function (i, item) { 
     $.each(item, function(key, value){ 
      lat.push(value.latitude); 
      lon.push(value.longitude); 
      price.push(value.price); 
      i++; 
     }); 
    }); 
    console.log(i); 
}); 

Ваша главная проблема заключалась в том, что из-за AJAX А (синхронно) J (avascript) А (й) X (ML), уведомление asynchronous, вы console.log (я) был уволен до того, как запрос был завершен. Другая проблема, которую я заметил, заключалась в том, что вы пытались только зацикливать объект. Хотя ваш JSON начинается с массива, который также должен быть зациклен.

Просто предложение. Родные петли довольно просты и работают быстрее. Я предложение не используя $.each:

var i = 0; 
var vehicleId = $('#selectVehicle option:selected').val(); 
$.getJSON('getFillingDetails.php', {id : vehicleId}, function(data){ 
    var lat = []; 
    var lon = []; 
    var price = []; 
    for (var i = 0, item = data[i]; i < data.length; i++) { 
     for (var key in item) { 
      var value = key[item]; 
      lat.push(value.latitude); 
      lon.push(value.longitude); 
      price.push(value.price); 
      i++; 
     }; 
    }; 
    console.log(i); 
}); 

Теперь я понимаю, что JQuery было сделано, чтобы сделать вашу работу проще. Но я думаю, что это просто заставляет разработчиков становиться ленивыми. Я думаю, что jQuery потрясающий. Но я уже перестал использовать $.each как только я понял, что родные петли легко с:

+0

Что вы говорите? – Shawn31313

+0

О, мой плохой. Но «-1» не был необходим. – Shawn31313

+0

A -1 не означает, что я не люблю вас или что-то личное. Все, что он делает, указывает на то, что я нашел что-то не так с вашим ответом и хотел, чтобы вы исправили его. В исходной версии он был похож на код OP, теперь, когда вы переместили журнал внутри обратного вызова, это имеет смысл. –

-1

Просто используйте индекс:

var data = [{"id":"1","latitude":"28.63","longitude":"77.21","price":"0"}, 
      {"id":"2","latitude":"28.71","longitude":"77.19","price":"100"}, 
      {"id":"2","latitude":"28.71","longitude":"77.19","price":"100"}]; 
var i; 
var lat = []; 
var lon = []; 
var price = []; 

$.each(data, function(index, value){ 
    lat.push(value.latitude); 
    lon.push(value.longitude); 
    price.push(value.price); 
    i = index; 
}); 

console.log(i); 

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

http://jsfiddle.net/vmy3b/3/

0

Попробуйте этот код

var i = 0; 
var vehicleId = $('#selectVehicle option:selected').val(); 
var jsonData; 
$.getJSON('getFillingDetails.php', {id : vehicleId}, function(data){ 

    jsonData = data; 
}); 
var lat = []; 
    var lon = []; 
    var price = []; 
$.each(jsonData, function(key, value){ 
     lat.push(value.latitude); 
     lon.push(value.longitude); 
     price.push(value.price); 
     i++; 
    }); 
console.log(i); 
+0

Он хотел записать последнее значение 'i', а не значение на каждой итерации. –

+0

эй говорит, что «значение i в консоли не изменяется, оно все равно 0. Это означает, что внутри $ .each()« ничего не происходит », указанная выше модификация покажет, что значение i меняется – iJade

+0

Внимательно прочитайте его код. Его console.log - это _outside_ getJSON, что означает, что отложенное выполнение остановит его от приращения до возвращения AJAX. –

0

Использование асинхронных функций в JavaScript иногда может быть запутанным, вот почему

Пример:

var result = 'pending'; 
$.ajax({ 
    url: 'something.php', 
    success: function() { 
    result = 'success'; 
    } 
}); 

Теперь, если мы хотим использовать результат здесь мы не получили бы хороший результат

console.log(result); // 'pending'

Поэтому вместо этого я думаю, что вам лучше позвонить 'f помазание»на том, как этот

var makeArray = function(data) { 
    var i = 0, 
     vehicleId = $('#selectVehicle option:selected').val(), 
     lat = [], lon = [], price = []; 

    $.each(data, function(key, value){ 
     lat.push(value.latitude); 
     lon.push(value.longitude); 
     price.push(value.price); 
     i++; 
    }); 
    console.log(i); 
}; 

$.getJSON('getFillingDetails.php', {id : vehicleId}, function(data){ 
    makeArray(data); 
}); 
Смежные вопросы