OVH Cloud OVH Cloud

parser json

22 réponses
Avatar
Olivier Masson
Bonjour,

Dans une variable, j'ai une structure JSON :
var infos = [
{nom: "xxx", prenom: "thomas", adresse:{rue:"avenue victor hugo", num:
"18", cp:"06000", ville:"NICE"}},
{nom: "yyy", prenom: "éric", adresse:{rue:"rue delille", num: "23",
cp:"75000", ville:"PARIS"}},
{nom: "zzz", prenom: "jeanne", adresse:{rue:"impasse toulouse lautrec",
num: "5", cp:"77500", ville:"CHELLES"}}
];

Et je veux récupérer un array contenant toutes les adresses.

Faut-il passer par un quelconque parser JSON ou est-ce une opération
simple en JS ?

Merci.

10 réponses

1 2 3
Avatar
Olivier Masson
Le 06/04/2012 17:25, SAM a écrit :

"push" s'emploie comme une fonction
<http://fr.selfhtml.org/javascript/objets/array.htm>
<http://fr.selfhtml.org/javascript/objets/array.htm#push>




On m'a conseillé de NE PAS aller sur autre chose que MDN (Mozilla) pour
les ressources JS. Apparemment, une très grande majorité de ce qui est
dit sur JS est un peu n'importe quoi...
Mais MDN manque un peu de contenu je trouve.


for (i in infos) {
adresses.push([infos[i].adresse.rue, infos[i].adresse.num,
infos[i].adresse.cp, infos[i].adresse.ville]);
}

for (i in infos) {
with(infos[i].adresse){ adresses.push( [rue, num, cp, ville] ); }
}



c'est ma préférée. Merci.


for (i in infos) {
var a = infos[i].adresse;
adresses.push([a.rue, a.num, a.cp, a.ville]);
}

Avatar
SAM
Le 10/04/12 10:02, Olivier Masson a écrit :
Le 06/04/2012 17:25, SAM a écrit :

"push" s'emploie comme une fonction
<http://fr.selfhtml.org/javascript/objets/array.htm>
<http://fr.selfhtml.org/javascript/objets/array.htm#push>



On m'a conseillé de NE PAS aller sur autre chose que MDN (Mozilla) pour
les ressources JS. Apparemment, une très grande majorité de ce qui est
dit sur JS est un peu n'importe quoi...



Non, je ne trouve pas que ce qu'ils disent chez selfhtml soit n'importe
quoi.
Je les trouve très didactiques, et ils indiquent le + souvent la
compatibilité du JS décrit en fonction du navigateur.
Le seul bémol, ils ont qque fois un métro de retard pour les "nouveautés"
(ce qui n'empêche pas ce que décrit de continuer à fonctionner)

Mais MDN manque un peu de contenu je trouve.



MDN ...
... ils ont revu leur moteur interne de serveur
et ... depuis
... c'est la pagaille !

Outre que mes bookmarks ne servent plus à rien, je n'y retrouve même
plus les pages correspondantes qui semblent avoir disparu au profit de
trucs télégraphiques ou re-visité (n'importe comment) par on n'sait qui !
J'évite donc au maximum.

for (i in infos) {
with(infos[i].adresse){ adresses.push( [rue, num, cp, ville] ); }
}



c'est ma préférée. Merci.



il parait qu'il faut de méfier de
with(truc.machin) { }
Je ne sais plus pourquoi. (bouffeur de ressources ? sources d'erreurs ?)



--
Stéphane Moriaux avec/with iMac-intel
Avatar
SAM
Le 10/04/12 14:44, SAM a écrit :
Le 10/04/12 10:02, Olivier Masson a écrit :

On m'a conseillé de NE PAS aller sur autre chose que MDN (Mozilla)



... c'est la pagaille !



Tiens, un exemple :
<https://developer.mozilla.org/en/JavaScript/Reference/Statements/with>
je clique en haut pour qu'il me cause en Français ...
hop ! page d'accueil fr
d'où que j'avais tapé "with" dans le machin de recherche !

et vazy que je tournenrond et nembourique !

il parait qu'il faut de méfier de
with(truc.machin) { }
Je ne sais plus pourquoi. (bouffeur de ressources ? sources d'erreurs ?)



bon ! dans le lien ci-haut ils le disent.
Sauf que c'est en angliche et qu'on n'y comprend rien (ou presque)
M'enfin ... ça a l'air d'être pour les raisons que j'ai évoquées, non ?

il serait donc, et si j'ai bien compris, préférable de faire :

for(i in infos) {
var a = infos[i].adresse;
with(a) { adresses.push([num,rue,cp,ville]}
}

mébon ...
pour une 20aine d'adresses c'est un peu compliquer les choses pour pas
grd gain.

--
Stéphane Moriaux avec/with iMac-intel
Avatar
Clément
Je conseille moi aussi MDN... en anglais.
La référence en français est en cours de re-traduction comme il est
indiqué ici :
https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript

Le moteur de recherche n'étant pas interne (ça c'est un vrai mauvais
point) mais un truc de référencement google, la plupart des recherches
tomberont sur les pages en anglais.

En attendant, soit on peut suivre en anglais (c'est quand même un peu
important quand on dév, je trouve, perso), soit parcourir le site sans
moteur de recherche (ce n'est pas impossible juste 3-4 clics au lieu d'un)

En partant de la page de garde javascript
https://developer.mozilla.org/fr/JavaScript , vous avez la référence (en
cours de re-traduction donc incomplète)
https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript
et le "core" (le noyau) de javascript
https://developer.mozilla.org/fr/JavaScript/Guide dans lequel on
retrouve les principales commandes js et les spécifications qui
devraient être suivies par tous les moteurs JS. Dans cette page, on
trouve, en autre, un descrition de "with"
https://developer.mozilla.org/fr/Guide_JavaScript_1.5/Instructions_de_manipulation_d'objets#L.27instruction_with
(toujours moins précise qu'en anglais quand même mais bon)

D'ailleurs, si vous êtes intéressé, la communauté francophone attend des
gens pour rédiger et traduire. Je crois qu'ils font des soirées pour ça
le mercredi sur Paris ou/et en ligne :) N'ayez pas peur c'est sous forme
de wiki, on peut revenir en arrière.

Par ailleurs, pour éviter "with", il ne faut pas faire

for(i in infos) {
var a = infos[i].adresse;
with(a) { adresses.push([num,rue,cp,ville]}
}



Mais plutôt

for(i in infos) {
var a = infos[i].adresse;
adresses.push([a.num,a.rue,a.cp,a.ville]}
}
Avatar
SAM
Le 10/04/12 20:47, Clément a écrit :

D'ailleurs, si vous êtes intéressé, la communauté francophone attend des
gens pour rédiger et traduire.



Non merci ! ;-)
(Ça m'est bien trop pénible !)

Par ailleurs, pour éviter "with", il ne faut faire plutôt

for(i in infos) {
var a = infos[i].adresse;
adresses.push([a.num,a.rue,a.cp,a.ville]}
}




Je m'en doutais un peu
(mais ce n'était pas le but, juste en améliorer l'utilisation)



M'enfin je n'ai touj pas compris qu'il faille l'éviter
- je l'ai touj vu fonctionner comme attendu
- et puis ... si c'est prévu ... pourquoi ne pas l’utiliser ?

--
Stéphane Moriaux avec/with iMac-intel
Avatar
SAM
Le 10/04/12 20:47, Clément a écrit :
La référence en français est en cours de re-traduction comme il est
indiqué ici :
https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript

En partant de la page de garde javascript
https://developer.mozilla.org/fr/JavaScript , vous avez la référence (en
cours de re-traduction donc incomplète)
https://developer.mozilla.org/fr/JavaScript/R%C3%A9f%C3%A9rence_JavaScript
et le "core" (le noyau) de javascript
https://developer.mozilla.org/fr/JavaScript/Guide dans lequel on
retrouve les principales commandes js et les spécifications qui
devraient être suivies par tous les moteurs JS. Dans cette page, on
trouve, en autre, un descrition de "with"
https://developer.mozilla.org/fr/Guide_JavaScript_1.5/Instructions_de_manipulation_d'objets#L.27instruction_with

(toujours moins précise qu'en anglais quand même mais bon)



non seulement imprécise mais bordélique puisqu'on y trouve le lien :
<https://developer.mozilla.org/fr/R%C3%A9f%C3%A9rence_de_JavaScript_1.5_Core/Instructions/with>
qui joue au jeu de l'oie : « repassez par la case départ »

(liens "suivant" et "précédent" font de même
« passez votre tour, allez en prison » )


Il me semble que l'ancienne mouture fonctionnait bien mieux.
--
Stéphane Moriaux avec/with iMac-intel
Avatar
Olivier Masson
Le 10/04/2012 20:47, Clément a écrit :


D'ailleurs, si vous êtes intéressé, la communauté francophone attend des
gens pour rédiger et traduire. Je crois qu'ils font des soirées pour ça
le mercredi sur Paris ou/et en ligne :) N'ayez pas peur c'est sous forme
de wiki, on peut revenir en arrière.




Je pense qu'il est quand important de savoir de quoi on parle :) Pour
exemple, je n'ai pas vraiment compris le "contre" de with dans le lien
donné par SAM
<https://developer.mozilla.org/en/JavaScript/Reference/Statements/with>
Avatar
Paul Gaborit
À (at) Wed, 11 Apr 2012 10:43:56 +0200,
Olivier Masson écrivait (wrote):

Le 10/04/2012 20:47, Clément a écrit :


D'ailleurs, si vous êtes intéressé, la communauté francophone attend des
gens pour rédiger et traduire. Je crois qu'ils font des soirées pour ça
le mercredi sur Paris ou/et en ligne :) N'ayez pas peur c'est sous forme
de wiki, on peut revenir en arrière.




Je pense qu'il est quand important de savoir de quoi on parle :) Pour
exemple, je n'ai pas vraiment compris le "contre" de with dans le lien
donné par SAM
<https://developer.mozilla.org/en/JavaScript/Reference/Statements/with>



Le principal problème de 'with' est lié à l'optimisation du code. À
l'intérieur d'un with, chaque nom peut se référer soit à un attribut de
l'objet du with soit à une variable du scope courant et le choix entre
ces deux possibilités doit se faire à chaque exécution (puisque l'objet
sur lequel porte 'with' change à chaque exécution). Cela empêche donc
d'optimiser le code.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Clément
Le 11/04/2012 10:43, Olivier Masson a écrit :
Je pense qu'il est quand important de savoir de quoi on parle :) Pour
exemple, je n'ai pas vraiment compris le "contre" de with dans le lien
donné par SAM
<https://developer.mozilla.org/en/JavaScript/Reference/Statements/with>



Prenons la page et traduisons :)

Using with is not recommended, and is forbidden in ECMAScript 5 strict
mode. The recommended alternative is to assign the object whose
properties you want to access to a temporary variable.
(On a historical note, Firefox 1.5 used to generate a warning when the
'with' statement was used: "deprecated with statement usage". This has
been removed in Firefox 1.5.0.1 ( bug 322430 ).)



Bon, déjà, "with" est interdit en ES5 en mode strict. Je ne traduirais
pas la page du mode strict mais en gros, c'est un mode plus "strict"
(sérieux ? :)) et il faut écrire "use strict"; dans votre code pour
qu'il soit mis en place. Autant dire que ça ne se voit pas souvent, mais
c'est à noter.
Les utilisateurs de FF 1.5 avaient un warning dans leur console leur
disant que l'utilisation de with était dépréciée. Bel essai de Mozilla
d'empêcher une commande qu'il n'aime pas trop ;-) ça a été retiré depuis
(malheureusement)

Con: 'with' forces the specified object to be searched first for all
name lookups. Therefore all identifiers that aren't members of the
specified object will be found more slowly in a 'with' block. Where
performance is important, 'with' should only be used to encompass code
blocks that access members of the specified object.



Comme le dit Paul Gaborit, dans l'instruction "with", chaque variable va
être vérifiée pour savoir si elle appartient à l'objet du with ou à un
des scopes parents. Cette vérification impacte les performances et comme
js est le plus souvent utilisé chez le client, c'est important
d'optimiser (car tout le monde n'a pas une machine de guerre :))

Il est quand même indiqué qu'au pire, "with" ne devrait donc être
utilisé qu'avec des accès au membre de l'objet spécifié.

Con: 'with' makes it hard for a human reader or JavaScript compiler to
decide whether an unqualified name will be found along the scope
chain, and if so, in which object. So given this example:
function f(x, o) {
with (o)
print(x);
}
only when f is called is x either found or not, and if found, either
in o or (if no such property exists) in f's activation object, where x
names the first formal argument. If you forget to define x in the
object you pass as the second argument, or if there's some similar bug
or confusion, you won't get an error -- just unexpected results.



Parfois, il est compliqué pour un humain pour le compiler js de savoir
quel scope utiliser. Dans la fonction ci-dessus, quand f() est appelée,
si x n'est pas défini dans l'objet o, on n'aura pas d'erreurs mais des
résultats inattendus (le x de la fonction sera pris et non le x de o).

-----

Personnellement, je ne trouve pas que le gain d'écriture de with soit
suffisant par rapport à une variable temporaire pour justifier une
baisse des performances (même minime)
Avatar
SAM
Le 12/04/12 08:06, Clément a écrit :

Comme le dit Paul Gaborit, dans l'instruction "with", chaque variable va
être vérifiée pour savoir si elle appartient à l'objet du with ou à un
des scopes parents. Cette vérification impacte les performances et comme
js est le plus souvent utilisé chez le client, c'est important
d'optimiser (car tout le monde n'a pas une machine de guerre :))



Heu ... je ne me souviens pas que ce with semblait influer sur les
performances au siècle dernier avec un NC.3 ou 4 ... sur une machine de
l'époque.
Me semble bien qu'on l'employait même assez facilement et sans état d'âme.

au jour d'aujourd'hui la non machine de guerre sera plus essoufflée par
la profusion de médias que les webmestres infligent que par un
malheureux 'with' (errant au milieu de 1072 lignes de jquery) !

Mébon ... les principes sont les principes ;-)

-----

Personnellement, je ne trouve pas que le gain d'écriture de with soit
suffisant par rapport à une variable temporaire pour justifier une
baisse des performances (même minime)



c'est juste que ça parait + élégant, simple, et directement parlant à la
lecture humaine, non ?

--
Stéphane Moriaux avec/with iMac-intel
1 2 3