var arr = [foo,bar,xyz];
arr[arr.indexOf('bar')] = true;
Есть ли более простой способ сделать это в JS?Javascript Arrays - Альтернатива arr [arr.indexOf()]?
var arr = [foo,bar,xyz];
arr[arr.indexOf('bar')] = true;
Есть ли более простой способ сделать это в JS?Javascript Arrays - Альтернатива arr [arr.indexOf()]?
Вы можете просто использовать объекты.
var obj = {foo: true, baz: false, xyz: true};
obj.baz = true;
Разве вы не подразумеваете 'obj.baz = true'? –
Что я делаю, сын! – Louis
Вы также должны отметить синтаксис 'obj [" baz "]', который, как мне кажется, нужен OP. –
Все значения в этом массиве уже не определены.
(Вы редактировали сообщение) Я не знаю, почему вы жалуетесь на 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);
Мой плохой. Я просто хотел спросить, есть ли способ ссылаться на элемент Array, не зная, что это индекс, кроме arr [arr.indexOf (что-то)]. Я обновил код; Благодарю. – tta
@Andrew - видя, что IE <9 не имеет '.indexOf()' на массивах, это не недопустимый вопрос, ваш ответ немного снисходителен и неинформирован. Это должно быть комментарий, если что-нибудь. –
Почему вы публикуете ответы, которые не являются ответами? Это должны быть комментарии. – Robert
В вашем примере вы действительно заменили бы «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
больше не применяется, так как он учитывает только массивы цифрового индекса, он не учитывает свойства массива, который что ключи в ассоциативном массиве[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 ]
Вот несколько альтернатив '.indexOf()', которые имеют тусклую поддержку IE, http://stackoverflow.com/questions/143847/best-way-to-find-an-item-in-a-javascript-array/143863 # 143863 – Robert
добро пожаловать в переполнение стека, не забудьте выбрать наиболее подходящий ответ и поддержать те ответы, которые были вам полезны. – vol7ron