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

Есть ли более простой способ сделать это в JS?Javascript Arrays - Альтернатива arr [arr.indexOf()]?

+0

Вот несколько альтернатив '.indexOf()', которые имеют тусклую поддержку IE, http://stackoverflow.com/questions/143847/best-way-to-find-an-item-in-a-javascript-array/143863 # 143863 – Robert

+0

добро пожаловать в переполнение стека, не забудьте выбрать наиболее подходящий ответ и поддержать те ответы, которые были вам полезны. – vol7ron

ответ

3

Вы можете просто использовать объекты.

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

Разве вы не подразумеваете 'obj.baz = true'? –

+0

Что я делаю, сын! – Louis

+0

Вы также должны отметить синтаксис 'obj [" baz "]', который, как мне кажется, нужен OP. –

1

Все значения в этом массиве уже не определены. (Вы редактировали сообщение) Я не знаю, почему вы жалуетесь на 2 целых строки кода.

Короткий ответ нет, вы не можете получить доступ к индексу массива, не зная индекса.

Один IE безопасным способом было бы создать прототип функции, которая позволяет установить его легко:

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

Это тогда может быть использована как:

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

Мой плохой. Я просто хотел спросить, есть ли способ ссылаться на элемент Array, не зная, что это индекс, кроме arr [arr.indexOf (что-то)]. Я обновил код; Благодарю. – tta

+2

@Andrew - видя, что IE <9 не имеет '.indexOf()' на массивах, это не недопустимый вопрос, ваш ответ немного снисходителен и неинформирован. Это должно быть комментарий, если что-нибудь. –

+1

Почему вы публикуете ответы, которые не являются ответами? Это должны быть комментарии. – Robert

0

В вашем примере вы действительно заменили бы «bar» истинным; ваш результирующий массив будет выглядеть как [foo, true, xyz].

Я думаю, предполагается, что то, о чем вы просите, является альтернативой наличию одного набора массивов для ключей и одного набора массивов для значений, чего нет лучшего способа.

Однако вы можете использовать ассоциативный массив или объекты для поддержания пары значений ключа.

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 

Это важно понимать несколько вещей, если вы используете этот метод:

  • array.length больше не применяется, так как он учитывает только массивы цифрового индекса, он не учитывает свойства массива, который что ключи в ассоциативном массиве
  • переключение между ключами/свойствами становится немного сложнее, так как объект Array должен иметь некоторые собственные свойства/методы
  • у вас может быть только одна пара ключ/значение. Структура массива вы перечислили бы позволено иметь [foo, bar, xyz, bar, foobar, foo], где индекс должен возвращать первое вхождение в чем-либо браузер, кроме IE < = 8

один способ сделать то, что вы конкретно спрашиваю:

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 ]