Page 1 sur 2
Utilisation de nsIDictionary
Publié : 18 mai 2006, 10:50
par thebluffer
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
Publié : 18 mai 2006, 21:42
par arno.
pourquoi pas une variable normale en javascript :
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;
}
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)
Publié : 18 mai 2006, 21:47
par thebluffer
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...
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++
}
}
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
Publié : 18 mai 2006, 21:58
par arno.
en javascript, tu peux rajouter des propriétés à la volée :
(ou bien myMapObject.prop3 = bli, c'est la même chose)
Publié : 18 mai 2006, 22:01
par thebluffer
Ok je suis démasqué, je suis plutot Java....
Effectivement ça m'a l'air plutot simple...
Un grand merci donc !
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
Publié : 18 mai 2006, 22:01
par arno.
D'ailleurs, nsDictionary ne fait fondamentalement pas grand chose d'autre
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;
}
};
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
Publié : 18 mai 2006, 22:06
par thebluffer
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
Publié : 18 mai 2006, 22:25
par thebluffer
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
Publié : 18 mai 2006, 22:31
par arno.
ben non, length, ça marche pas sur les tableaux associatifs. L'idée que je donne dans mon premier poste ne marche pas ?
Publié : 18 mai 2006, 22:35
par arno.
ah, j'ai compris ce que tu veux faire.
for (var prop in une_variable) {
var value = variable [prop];
}
ou sinon directement
for each (var value in une_variable) {
}
Publié : 19 mai 2006, 08:02
par Benoit
C'est du PHP ça
En JavaScript c'est quelque chose comme
Code : Tout sélectionner
for (var i in object) {
alert('object[\''+i+'\'] is ' + object[i]);
}
Publié : 19 mai 2006, 10:15
par martin
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.
thebluffer a écrit :Pourtant il me semblait que l'on ne pouvait pas indexer les tableaus avec des chaines de caractères...
Non, effectivement on ne peut pas, même si on en a l'impression.
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
Publié : 19 mai 2006, 10:49
par thebluffer
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
Publié : 19 mai 2006, 23:52
par Benoit
martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.
Voir :
http://developer.mozilla.org/fr/docs/Un ... s_tableaux
Publié : 20 mai 2006, 09:54
par thebluffer
Benoit a écrit :martin a écrit :Et également la propriété length, accessible par crochet ou point, qui contient le nombre d'élément du tableau.
Si ta documentation dit ça, elle est fausse. La propriété length renvoie en fait le plus grand index du tableau + 1.
Voir :
http://developer.mozilla.org/fr/docs/Un ... s_tableaux
Je pense que la subtilité c'est que le tableau est étendu du nombre d'indice...
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