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

在JS中有更简单的方法吗?JavaScript数组 - 替代arr [arr.indexOf()]?

+0

下面是'.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

+0

欢迎来到堆栈溢出,不要忘记选择最合适的答案,并提出你认为有用的答案。 – vol7ron 2010-09-28 03:22:45

回答

3

你可以只使用对象。

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

你不是指'obj.baz = true'吗? – 2010-09-28 02:07:29

+0

我是,儿子! – Louis 2010-09-28 02:11:36

+0

您还应该注意'obj [“baz”]'语法,这是我认为OP需要的。 – 2010-09-28 02:23:54

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

我的不好。我只是想问,除了arr [arr.indexOf(something)]之外,是否有任何方法可以引用Array元素而不知道它是否是索引。我更新了代码;谢谢。 – tta 2010-09-28 01:53:21

+2

@Andrew - 因为IE <9在数组上没有'.indexOf()',所以这不是一个无效的问题,你的答案有点居高临下,并且不知情。如果有的话,这应该是一个评论。 – 2010-09-28 01:54:48

+1

你为什么发布不是答案的答案?这些应该是评论。 – Robert 2010-09-28 01:54:53

0

在你的例子中,你真的只能用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不再适用,因为它只能通过数值指标占阵列,它不指望阵列性能,这是关联数组中的键是什么
  • 通过键/属性循环变得有点困难,因为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 ]