Utilisation de nsIDictionary
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Utilisation de nsIDictionary
Bonjour, je souhaiterais créer une map pour stocker le nombre d'occurences d'une donnée.
Le composant nsIDictionary me semble approprié mais je n'arrive pas à créé une instance.
J'ai un message comme quoi la classe n'a pas de propriétés.
Quelqu'un a-t-il déjà utilisé ce composant, un composant plus adapté existe-t-il ?
Je code un composant en javascript pour Mozilla Thundebird
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
Le composant nsIDictionary me semble approprié mais je n'arrive pas à créé une instance.
J'ai un message comme quoi la classe n'a pas de propriétés.
Quelqu'un a-t-il déjà utilisé ce composant, un composant plus adapté existe-t-il ?
Je code un composant en javascript pour Mozilla Thundebird
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
pourquoi pas une variable normale en javascript :
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.3) Gecko/20060326 Firefox/1.5.0.3 (Debian-1.5.dfsg+1.5.0.3-2)
Code : Tout sélectionner
var une_variable = {
prop1 : bla,
prop2 : blo
}
function longueur_de_la_variable() {
var l = 0;
for (var prop in une_variable)
l++;
return l;
}
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Merci Arno,
Mais je voudrais quelque chose de plus dynamique avec des accesseurs.
En fait je pense faire plutot quelque chose du genre, mais je ne suis pas un spécialiste du javascript, on peut donc sans doute faire plus beau...
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Mais je voudrais quelque chose de plus dynamique avec des accesseurs.
En fait je pense faire plutot quelque chose du genre, mais je ne suis pas un spécialiste du javascript, on peut donc sans doute faire plus beau...
Code : Tout sélectionner
var myMapObject = {
var propNameArray = new Array;
var propValueArray = new Array;
i = 0
get: function(name) {
for (j=0;j<i;j++) {
if(propNameArray[j] == name) {
return propValueArray[j];
}
}
},
set: function(name, value) {
propNameArray[i] = name;
propNalueArray[i] = value;
i++
}
}
en javascript, tu peux rajouter des propriétés à la volée :
(ou bien myMapObject.prop3 = bli, c'est la même chose)
Code : Tout sélectionner
myMapObject['prop3'] = bli;
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
D'ailleurs, nsDictionary ne fait fondamentalement pas grand chose d'autre
Si tu as besoin de faire d'autres trucs lorsque tu accédes à, ou modifies tes propriétés, regarde du côté des getters et setters.
http://developer.mozilla.org/en/docs/Co ... nd_Setters
Code : Tout sélectionner
nsDictionary.prototype= {
hasKey: function(key) { return this.hash.hasOwnProperty(key) },
getKeys: function(count) {
var asKeys = new Array();
for (var sKey in this.hash) asKeys.push(sKey);
count.value = asKeys.length;
return asKeys;
},
getValue: function(key) {
if (!this.hasKey(key))
throw Components.Exception("Key doesn't exist");
return this.hash[key];
},
setValue: function(key, value) { this.hash[key] = value; },
deleteValue: function(key) {
if (!this.hasKey(key))
throw Components.Exception("Key doesn't exist");
var oOld = this.getValue(key);
delete this.hash[key];
return oOld;
},
clear: function() { this.hash = {}; },
QueryInterface: function(iid) {
if (!iid.equals(Components.interfaces.nsISupports) &&
!iid.equals(DICTIONARY_IID))
throw Components.results.NS_ERROR_NO_INTERFACE;
return this;
}
};
http://developer.mozilla.org/en/docs/Co ... nd_Setters
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Non c'est bon en fait un bête tableau suffit à mes besoins.
Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères... C'est surement dans un autre langage, à force de changer on s'y perd !
Et encore merci !
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères... C'est surement dans un autre langage, à force de changer on s'y perd !
Et encore merci !
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Ha heu, bon je suis embêté en fait après j'ai besoin de reparcourir le tableau sans savoir combien d'élément il y a et à quels indexs :
Je pensais faire comme suit mais après avoir rempli mon tableau, celui-ci compte toujours 0 éléments... Alors que quand j'accède à un index connu je récupère bien une valeur...
alert("Taille du tableau : " + attributeMap.length);
for(var i = 0; i < attributeMap.length; i++) {
alert(attributeMap);
}
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Je pensais faire comme suit mais après avoir rempli mon tableau, celui-ci compte toujours 0 éléments... Alors que quand j'accède à un index connu je récupère bien une valeur...
alert("Taille du tableau : " + attributeMap.length);
for(var i = 0; i < attributeMap.length; i++) {
alert(attributeMap);
}
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
C'est du PHP ça 
En JavaScript c'est quelque chose comme

En JavaScript c'est quelque chose comme
Code : Tout sélectionner
for (var i in object) {
alert('object[\''+i+'\'] is ' + object[i]);
}
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Li tens revient, je ne fais riens. ♪
bonjour,
je suis d'accord avec tout ce qui t'a été dit, mais ayant récemment remis le nez dans la doc, je me permet quelques précisions, en espérant ne pas dire de bétises.
un Array est objet dérivé d'un Object.
Et on peut accéder aux propriétés/méthodes d'un Object avec la notation par point (myObject.property1) ou par la notation par crochet (myObject['property1']).
Un Array contient les données du tableau, accessibles par myArray[indice]. Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau[edit]l'indice le plus grand du tableau + 1[/edit].
Si tu fait myVar['aString'] = 'aValue', tu ajoute une propriété (comme length) à ta variable, mais tu ne rajoutes pas de donnée dans le tableau...
Pour augmenter la confusion : les boucles for..in, dédiée aux Object (et dont hérite Array), permet de passer en revue tous les propriétés/méthodes d'un objet, mais on a exclue volontairement la propriété length d'un tableau de ce parcours...(de même d'ailleurs que d'autres propriétés, comme prototype et constructor)
pour être plus explicite, un peu de code :
je suis d'accord avec tout ce qui t'a été dit, mais ayant récemment remis le nez dans la doc, je me permet quelques précisions, en espérant ne pas dire de bétises.
Non, effectivement on ne peut pas, même si on en a l'impression.thebluffer a écrit :Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères...
un Array est objet dérivé d'un Object.
Et on peut accéder aux propriétés/méthodes d'un Object avec la notation par point (myObject.property1) ou par la notation par crochet (myObject['property1']).
Un Array contient les données du tableau, accessibles par myArray[indice]. Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau[edit]l'indice le plus grand du tableau + 1[/edit].
Si tu fait myVar['aString'] = 'aValue', tu ajoute une propriété (comme length) à ta variable, mais tu ne rajoutes pas de donnée dans le tableau...
Pour augmenter la confusion : les boucles for..in, dédiée aux Object (et dont hérite Array), permet de passer en revue tous les propriétés/méthodes d'un objet, mais on a exclue volontairement la propriété length d'un tableau de ce parcours...(de même d'ailleurs que d'autres propriétés, comme prototype et constructor)
pour être plus explicite, un peu de code :
Code : Tout sélectionner
var myVar = new Array();
myVar[0] = 'value 1';
myVar['aString'] = 'value 2';
myVar[1] = 'value 3';
var test = '';
for (var i = 0 ; i < myVar.length; i++) {
// parcourt toutes les données du tableau
test = test + i + ' : ' + myVar[i];
}
alert(test);
// affiche ->
// 0 : value 1
// 1 : value 3
test = '';
for (var j in myVar) {
//parcourt toutes les propriétés de myVar (dont les données du tableau), sauf length
test = test + j + ' : ' + myVar[j] + '\n';
}
alert(test);
// affiche ->
// 0 : value 1
// aString : value 2
// 1 : value 3
Dernière modification par martin le 20 mai 2006, 11:20, modifié 1 fois.
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Ha ok, je me suis il est vrai emmelé les pinceaux.
Donc c'est des propriétés que j'affecte et ce n'est donc pas un tableau du coup je n'ai surement pas besoin de déclarer un array.
La boucle for in devrait me permettre de balayer les propriétés que j'ai ajouté..
Je test ça ce soir.
Un grand merci à tous pour ces explications.
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
Donc c'est des propriétés que j'affecte et ce n'est donc pas un tableau du coup je n'ai surement pas besoin de déclarer un array.
La boucle for in devrait me permettre de balayer les propriétés que j'ai ajouté..
Je test ça ce soir.
Un grand merci à tous pour ces explications.
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Voir : http://developer.mozilla.org/fr/docs/Un ... s_tableaux
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Li tens revient, je ne fais riens. ♪
-
- Salamandre
- Messages : 21
- Inscription : 26 déc. 2005, 16:52
Je pense que la subtilité c'est que le tableau est étendu du nombre d'indice...Benoit a écrit :Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Voir : http://developer.mozilla.org/fr/docs/Un ... s_tableaux
toto[0] = 1;
toto[2] = 2;
Le tableau alloué est alors de 3 indices (le toto[1] a une allocation de faite même si on l'utilise pas)...
Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.0.3) Gecko/20060426 Firefox/1.5.0.3
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités