2010-09-28 50 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 ]