2012-09-18 6 views
0

Ce que je suis en train d'accomplir appelle result.MappingWaypoints[i].lat(); et result.MappingWaypoints[i].lng(); au lieu de result.MappingWaypoints[i].lat; et result.MappingWaypoints[i].lng.dans un tableau javascript

Est-ce encore possible?

var result = new Array(); 
    result = { 
     'MappingWaypoints': MappingWaypoints, 
     'Flightime': flight_time_sec, 
     'PhotoArea': { 'SouthWest': MeterstoGPS(starting_photo_area), 
         'NorthEast': MeterstoGPS(end_photo_area)}, 
    }; 


MappingWaypoints.push(
{ 
    lat : current_point_gps.lat, 
    lng : current_point_gps.lng, 
    Radius : 10, 
    Altitude : Attitude, 
    ClimbRate : ClimbRate, 
    DelayTime : DelayTime, 
    WP_Event_Channel_Value : 100, 
    Heading : 0, 
    Speed : Speed, 
    CAM_Nick : 0, 
    Type : 1, 
    Prefix : "P" 
} 

Edit: J'ai essayé d'ajouter:

lat: function(){ return current_point_gps.lat},` 


lng : function(){ return current_point_gps.lng}, 

Mais cela ne fonctionne pas => toutes les valeurs du tableau ont la valeur lat/long de la première coord

Edit2: Merci à @DCoder pour cette réponse dans les commentaires ci-dessous: cela a résolu pour moi.

lat: (function(v) { return function() { return v; } })(current_point_gps.lat) 

Je sais que cela peut sembler être une chose étrange à faire, mais un algorithme j'utilise vraiment besoin d'acces des données comme un appel de fonction, car l'algo traite également des données de l'api google où les données ne sont accessibles par la même fonction, appelez lat() et lng(). MERCI :)

+0

À moins que vous ne créiez une solution de stockage plus complexe, les réponses données jusqu'à maintenant disparaîtront une fois que la valeur de 'current_point_gps' sera modifiée. – DCoder

+0

Note latérale - vous mélangez des tableaux et des objets (qui sont des tableaux associatifs), donc n'utilisez pas 'var result = new array()' quand vous le traitez comme un tableau/objet associatif. – PhonicUK

+0

@DCoder: vous avez absolument raison – Thomas

Répondre

1

Votre approche originale se jette dans le problème qui est décrit dans this question - en raison de la portée des variables JS, toutes les fonctions souligneront (et retour) la même variable.

Vous devez saisir la valeur vous voulez retourner pour chaque propriété, au lieu de capturer une variable . La façon la plus simple de le faire est une fonction d'auto-exécution:

{ 
    lat: (function(v) { return function() { return v; } })(current_point_gps.lat), 
    lng: (function(v) { return function() { return v; } })(current_point_gps.lng), 
    .... 
} 

Si vous avez besoin d'un moyen de modifier aussi la propriété lat, vous pouvez ajouter une propriété publique à l'objet, comme ceci:

{ 
    lat: function() { return this._lat; }, 
    _lat: current_point_gps.lat 
} 

Ou vous pouvez utiliser quelque chose de similaire à paradigme "0 arguments sortiras, 1 argument signifie ensemble" de jQuery et utiliser ceci:

{ 
    lat: (function(v) { return function() { 
    if(arguments.length) { 
     v = arguments[0]; 
    } else { 
     return v; 
    }; 
    })(current_point_gps.lat) 
} 

obj.lat(); // returns the current value 
obj.lat(55); // changes the current value to 55, returns nothing 
obj.lat(); // returns 55 
+0

Est-il également possible de changer cette valeur de lat et lng avec ou sans fonction une fois le tableau créé? (edit: ne pas pousser, je veux changer la valeur de lat/lng parce que leurs coordonnées sont tournées) – Thomas

+0

@ThomasVerbeke: oui, réponse mise à jour. – DCoder

0

Vous auriez besoin de les appeler en fonction.

lat : function(){ return current_point_gps.lat }, 
lng : function(){ return current_point_gps.lng }, 

Cela devrait fonctionner (non testé;)).

Mais pourquoi voudriez-vous le faire?

Edit:

Si vous voulez passer la fonction, vous ne devriez pas appeler la fonction.

// Pass the Result of a function, the function is called 
var foobar = result.MappingWaypoints[i].lng(); 

// Pass the function itself, the function wont be called 
var foobar = result.MappingWaypoints[i].lng; 
+0

J'aurais dû mentionner que j'ai essayé ça. Je sais que cela semble étrange mais la raison en est qu'une autre méthode doit absolument accéder aux données en tant que fonction ... – Thomas

+0

Ensuite, essayez ceci et supprimez le(); – SvenFinke

+0

De cette façon, les variables deviennent des fonctions. Mais en utilisant lat(); vous allez passer le résultat de la fonction, et ce serait une chaîne. Passez lat et ensuite vous passerez la fonction elle-même. – SvenFinke

0
lat : function() { return current_point_gps.lat }, 
lng : function() { return current_point_gps.lng }, 

je ne vois pas pourquoi cela est nécessaire si

+0

aurait dû mentionner que j'ai essayé cela. Je sais que cela semble étrange mais la raison en est qu'une autre méthode doit impérativement accéder aux données en tant que fonction. – Thomas

Questions connexes