var arr = [foo,bar,xyz];
arr[arr.indexOf('bar')] = true;
在JS中有更简单的方法吗?JavaScript数组 - 替代arr [arr.indexOf()]?
var arr = [foo,bar,xyz];
arr[arr.indexOf('bar')] = true;
在JS中有更简单的方法吗?JavaScript数组 - 替代arr [arr.indexOf()]?
你可以只使用对象。
var obj = {foo: true, baz: false, xyz: true};
obj.baz = true;
你不是指'obj.baz = true'吗? – 2010-09-28 02:07:29
我是,儿子! – Louis 2010-09-28 02:11:36
您还应该注意'obj [“baz”]'语法,这是我认为OP需要的。 – 2010-09-28 02:23:54
该数组中的所有值都是未定义的。
(你编辑了你的帖子)我不知道你为什么抱怨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);
在你的例子中,你真的只能用true替换“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 2010-09-28 02:00:41
欢迎来到堆栈溢出,不要忘记选择最合适的答案,并提出你认为有用的答案。 – vol7ron 2010-09-28 03:22:45