सरणी में जावास्क्रिप्ट धक्का सरणी

वोट
5

मैं वर्तमान में गूगल के नक्शे 'जियोकोडिंग के साथ काम कर रहा हूँ और एक सरणी है कि एक तत्व के रूप में सरणियों में शामिल होंगे बनाना होगा।

मूल रूप से मैं इस बनाने की जरूरत:

    var locations = [
      ['Bondi Beach', -33.890542, 151.274856, 4],
      ['Coogee Beach', -33.923036, 151.259052, 5],
      ['Cronulla Beach', -34.028249, 151.157507, 3],
      ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
      ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];

लेकिन गतिशील! मैं एक नक्शे पर पिन डाल करने के लिए बाद में इस सरणी की जरूरत है।

मै क्या कर रही हूँ:

        var locations = []; // The initial array
        for (var i = 0; i < addresses.length; ++i){

            var address=addresses[i]; // the address e.g. 15 Main St, Hyannis, MA
            geocoder.geocode({ 'address': address}, function(results){
                var obj = {
                    0: address,
                    1: results[0].geometry.location.hb,
                    2: results[0].geometry.location.ib,
                    3: i
                };
                console.log(obj);
                locations.push(new Array());
                locations[i].push(obj);

            });
        };

        console.log(locations.length);

समस्या, प्रश्न:

मैं किसी भी त्रुटि नहीं दिख रहा है, लेकिन अंत स्थानों पर [] सरणी खाली है।

यहाँ एक सांत्वना स्क्रीन अगर जरूरत है:

01/03/2013 को 17:17
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

यह आप सभी की जरूरत किया जाना चाहिए:

geocoder.geocode({ 'address': address}, function(results){
            locations.push([
              address,
              results[0].geometry.location.hb,
              results[0].geometry.location.ib,
              i //this is actually going to always be 
                //addresses.length because the callback won't fire
                //until well after the loop has completed. 
                //Is this really a necessary field to have 
                //in your array? if so, you'll need to refactor a bit
            ]);
        });
01/03/2013 को 17:19
का स्रोत उपयोगकर्ता

वोट
1

मैं कोड का परीक्षण करने के लिए समय नहीं था, लेकिन यह इस तरह से काम करना चाहिए:

    function requestLocations( addresses, callback ) {
        var remainingLocations = addresses.length;
        var locations = [];

        for (var i = 0; i < addresses.length; ++i){

            var address=addresses[i]; // the address e.g. 15 Main St, Hyannis, MA

            locations[i] = [];

            geocoder.geocode({ 'address': address}, (
                function(idx) {
                    return function(result) {
                        locations[idx] = [  addresses[idx], 
                                            results[0].geometry.location.hb,
                                            results[0].geometry.location.ib,
                                            idx
                                        ];

                        //decrement the number of remaining addresses
                        --remainingLocations;

                        //if there are no more remaining addresses and a callback is provided then call this calback with the locations
                        if( remainingLocations === 0 && callback ) {
                            callback(locations);
                        }               
                    }; // returns the real callback function for your geocoding

                })(i) //direct invocation of function with paramter i for scoping
            );

        }
    }


    requestLocations(addresses, function( locations ) {
        console.dir(locations);
        console.log(locations.length);
    });

अपने कोड के साथ समस्या इस प्रकार है। सबसे पहले कोड के इस हिस्से निष्पादित किया जाता है:

        var locations = []; // The initial array
        for (var i = 0; i < addresses.length; ++i) {

            var address = addresses[i]; // the address e.g. 15 Main St, Hyannis, MA
            geocoder.geocode({
                'address': address
            }, function(results) {
                //this part is called later when that data is ready (it is an asynchronous callback)

            });
        };

        //because of the async request this is still 0
        console.log(locations.length);

उसके बाद कॉलबैक ही जैसे ही ब्राउज़र सर्वर से डेटा प्राप्त कहा जाता है:

      function(results) {
        var obj = {
            0: address,
            1: results[0].geometry.location.hb,
            2: results[0].geometry.location.ib,
            3: i
        };
        console.log(obj);
        locations.push(new Array());
        locations[i].push(obj);

      }
01/03/2013 को 17:41
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more