2010-09-28 4 views
1
var arr = [foo,bar,xyz]; 
arr[arr.indexOf('bar')] = true; 

Existe-t-il un moyen plus simple de faire cela dans JS?Javascript Tableaux - Alternative à arr [arr.indexOf()]?

+0

Voici quelques alternatives à '.indexOf()' qui a un support IE terne, http://stackoverflow.com/questions/143847/best-way-to-find-an-item-in-a-javascript-array/143863 # 143863 – Robert

+0

bienvenue à empiler débordement, ne pas oublier de sélectionner la réponse la plus appropriée et upvote les réponses que vous avez trouvé utile. – vol7ron

Répondre

3

Vous pouvez simplement utiliser des objets.

var obj = {foo: true, baz: false, xyz: true}; 
obj.baz = true; 
+0

ne veux-tu pas dire 'obj.baz = true'? –

+0

Que je fais, fils! – Louis

+0

Vous devriez également noter la syntaxe 'obj [" baz "]', qui est ce que je pense que l'OP veut. –

1

Toutes les valeurs de ce tableau sont déjà indéfinies. (Vous avez édité votre message) Je ne sais pas pourquoi vous vous plaignez de 2 lignes entières de code si. Réponse courte non, vous ne pouvez pas accéder à un index d'un tableau sans connaître l'index.

Un IE moyen sûr serait de créer une fonction prototypé qui vous permet de définir facilement:

Array.prototype.setKeysWithValue = function(keyValue,newValue) 
    { 
    var i; 
    for (i in this) 
     { 
     if (this[i] === keyValue) 
      this[i] = newValue; 
     } 
    } 

Cela peut ensuite être utilisé comme:

var arr = ['foo','bar','xyz']; 
arr.setKeysWithValue('bar',true); 
+0

Mon mauvais. Je voulais juste demander s'il y a moyen de se référer à un élément Array sans savoir que son index est différent de arr [arr.indexOf (quelque chose)]. J'ai mis à jour le code; Merci. – tta

+2

@Andrew - vu que IE <9 n'a pas '.indexOf()' sur les tableaux, ce n'est pas une question invalide, votre réponse est un peu condescendante, et non informée. Cela aurait dû être un commentaire si quelque chose. –

+1

Pourquoi publiez-vous des réponses qui ne sont pas des réponses? Ceux-ci devraient être des commentaires. – Robert

0

Dans votre exemple, vous ne remplaceriez réellement "bar" par true; votre tableau résultant ressemblerait à [foo, true, xyz].

Je pense qu'il est supposé que ce que vous demandez est une alternative à avoir un ensemble de tableaux pour les clés et un ensemble de tableaux pour les valeurs, dont il n'y a pas de meilleure façon. Toutefois, vous pouvez utiliser un tableau associatif ou des objets pour conserver une paire de valeurs de clé.

var f = false, t = true; 

// associative array 
var arr = new Array(); 
arr["foo"] = arr["bar"] = arr["foobar"] = f; 
arr["bar"] = t; 


// object 
var obj; 
obj = {"foo":f, "bar":f, "foobar":f}; 
obj["bar"] = t; 

// the difference is seen when you set arr[0]=t and obj[0]=t 
// the array still maintains it's array class, while the object 
// is still a true object 

Il est important de réaliser quelques choses si vous utilisez cette méthode:

  • la array.length n'est plus, car il ne tient compte que des tableaux par index numérique, il ne les propriétés du tableau compte pas, ce qui est ce que les clés dans un tableau associatif sont
  • en boucle par les clés/propriétés devient un peu plus difficile puisque l'objet Array devrait avoir des propriétés/méthodes natives
  • vous ne pouvez avoir qu'une paire clé/valeur. La structure du tableau que vous avez indiqué serait autorisé à avoir [foo, bar, xyz, bar, foobar, foo], où l'indice devrait retourner la première occurrence dans tout autre navigateur que IE < = 8

Une autre façon de faire ce que vous spécifiquement poser est:

Array.prototype.replace = function(from,to){ this[this.indexOf(from)]=to;        }; 
    Array.prototype.replaceAll = function(from,to){ while(this.indexOf(from)>=0){this[this.indexOf(from)]=to;} }; 

    var arr = new Array(); 
    arr=[ "foo", "bar", "foobar", "foo" ]; 
    arr.replace("bar",true);    // [ "foo", true, "foobar", "foo" ] 
    arr.replaceAll("foo",false);   // [ false, true, "foobar", false ]