2011-08-03 2 views
3

J'ai un simple tableau:Javascript setattr ou setOwnProperty

var arr = ['has_cats', 'has_dogs']; 

et un objet:

var obj = new Object(); 

et du tableau que je veux définir des attributs objet:

for(i=0; i < arr.length; i++) { 
     if(!arr.hasOwnProperty(arr[i])) { 
       // set the object property 
     } 
} 

Après en boucle je devrais pouvoir appeler obj.has_cats mais je n'arrive pas à trouver un moyen correct de le faire en javascript. En python, j'appellerais setattr(obj,arr[i], value). J'ai pensé que si les objets ont un hasOwnProperty ils devraient également avoir un getOwnProperty et un setOwnProperty.

Une guidance?

Répondre

3

« je me suis dit que si les objets ont une hasOwnProperty ils devraient aussi avoir un getOwnProperty et un setOwnProperty »

La fonction hasOwnProperty() vous indique si la propriété nommée existe comme une propriété directe de l'objet, par rapport à être une propriété héritée de quelque part dans la chaîne prototype de l'objet. L'opérateur in - utilisé comme if (someProperty in someObject) {} - vous dira si l'objet possède cette propriété n'importe où dans la chaîne du prototype.

Vous n'avez pas besoin d'une fonction setOwnProperty() correspondante parce que vous pouvez simplement dire:

someObject[someProperty] = someValue; 

Je suppose que l'idée d'une fonction correspondante getOwnProperty() sorte de logique si vous voulez une fonction qui renvoie uniquement une valeur si la propriété spécifiée est une propriété directe, mais il n'y aurait aucun moyen d'indiquer que la propriété spécifiée n'a pas été trouvée, car null, undefined, false, etc. sont toutes des valeurs potentielles légitimes si la propriété est. Donc, pour y parvenir, vous devez le faire en deux étapes en utilisant if (hasOwnProperty()).

Mais ce n'est pas ce que vous essayez de faire. Si je vous comprends bien, vous voulez juste un moyen de définir une propriété où le nom de la propriété est dans une variable (dans votre cas, un élément de tableau).Vous n'indiquez pas clairement les valeurs que vous souhaitez associer à ces propriétés. Je vais donc utiliser true.

var arr = ['has_cats', 'has_dogs']; 

var obj = {}; // note {} is generally preferred to new Object(); 

for(var i=0; i < arr.length; i++) { 
    // if the property doesn't already exist directly on 
    // the object 
    if(!obj.hasOwnProperty(arr[i])) { 
    // set the object property 
    obj[arr[i]] = true; 
    } 
} 

// can access with bracket notation 
alert(obj["has_cats"]); 

// can access with dot notation 
alert(obj.has_cats); 
2

Vous pouvez définir la valeur via:

for(i = 0; i < arr.length; i++) { 
     if(!obj.hasOwnProperty(arr[i])) { 
       obj[arr[i]] = 'value'; 
     } 
} 
+1

Me battre de 10 secondes :( – karim79

+0

m'arrive tout le temps;) – mikeycgto

+0

a voté pour vous la réponse mais a choisi une autre pour l'effort. Merci les gars d'avoir répondu. –

0

Vous pouvez définir la propriété avec:

obj[arr[i]] = "my value"; 

javascript accès à la propriété peut être fait soit par .name ou ['name'].

1

Je pense que vous êtes un peu trop compliqué. Essayez ceci:

var arr = ['has_cats', 'has_dogs']; 
var obj = new Object(); 
for(i=0; i < arr.length; i++) { 
    obj[arr[i]] = true; 
} 

Vous n'avez pas besoin d'utiliser hasOwnProperty contre un tableau quand par ses itérer indices. Bien que peut-être vous vouliez vérifier obj comme un garde contre l'écrasement de tout ce qui était déjà réglé?

2

Ni getOwnProperty ni setOwnProperty ajouterait une valeur:

Voici toujours définissez la propriété sur l'objet qui a évalué à partir x. Par conséquent, setOwnProperty n'est rien de plus qu'une affectation de propriété.

x[prop] = v 

De même, en utilisant une combinaison de hasOwnProperty et de l'existence de la propriété, il est possible de déduire (et remplacer) getOwnProperty:

if (x.hasOwnProperty(prop)) { 
    // x has prop 
    // x[prop] may evaluate to undefined 
} else if (prop in x) { 
    // prop resolved through [[prototype]] chain 
    // x[prop] may evaluate to undefined 
} else { 
    // property prop not set 
    // x[prop] will evaluate to undefined 
} 

Bonne codage.

+0

+1 - vous avez réussi avec quatre phrases à dire ce qui a pris quatre paragraphes dans ma réponse. Bon exemple de code clair aussi. – nnnnnn