parcours d’objet non au for in

Le parcours d’un objet pour le copier peut se faire facilement via un for in exemple:

var a = {
b:"a",
c:"e"
}
var copie = {};

for(var i in a){
copie[i] = a[i]
}

le problème est que le for in parcours aussi les propriétés hérités et donc les méthodes. Si on voulais ne par copier les propriétés hérités cela donnerait
for(var i in a){
if(a.hasOwnProperty(i)){
copie[i] = a[i]
}
}

mais là les performances sont encore plus mauvaises.
Une solution est d’utiliser Object.keys (ie9+) pour récupérer les clef de l’objet.

var keys = Object.keys(obj);
var lg = keys.length
for (var i = 0; i < lg; i++){
var o = keys[i];
copie[o] = a[o];
}

ça risque d'être un peu long à chaque fois de réécrire tout ça faisons en une fonction:

var forOf =function(obj, func){
var keys = Object.keys(obj);
var lg = keys.length
for (var i = 0; i < lg; i++){
var o = keys[i];
func(obj[o], o, obj);
}
}

et l'appel pour la copie par exemple
forOf(a,function(obj,i){
copie[i]=obj;
})

Si la fonction s'appelle for of c'est car les vrai navigateurs supporte cette propriété https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of

l'utilisation de cette fonction pour les boucles va vous permettre d'optimiser vos performances par deux https://jsperf.com/object-keys-iteration/20 sauf sur ie apparemment en ne testant pas que l'objet est pas hérité ou on perd quelques pourcentages négligeables.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current ye@r *