-1

$.getJSON によって Web サーバーから json 応答を取得しています。これは応答です:

[{"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がまったく初めてです。どんな助けでも大歓迎です。

4

4 に答える 4

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 が A(synchronous)J(avascript)A(nd)X(ML) であるためasynchronous、console.log(i) がリクエストが完了する前に起動されたことです。私が気付いたもう 1 つの問題は、オブジェクトをループ処理しようとしていたことです。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しかし、ネイティブループが簡単だと気づいたら、使用をやめましたc:

于 2013-07-17T05:52:31.133 に答える
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);
于 2013-07-17T05:58:54.953 に答える
0

JavaScript で非同期関数を使用すると、混乱することがあります。その理由は次のとおりです。

:

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

ここで結果を使用したい場合、良い結果は得られません

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

代わりに、このように「関数」を呼び出すほうがよいと思います

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 );
});
于 2013-07-17T06:15:37.353 に答える
-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/

于 2013-07-17T05:58:41.633 に答える