2010-04-10 77 views
20

設置我有一個數組檢查數組項目在JS

var assoc_pagine = new Array(); 
    assoc_pagine["home"]=0; 
    assoc_pagine["about"]=1; 
    assoc_pagine["work"]=2; 

我試圖

if (assoc_pagine[var] != "undefined") { 

,但它似乎沒有工作

我使用jquery,我不知道它是否可以幫到

謝謝

+2

javascript中的數組不使用關聯鍵。在數組上設置「關聯鍵」時,實際上是在該數組對象上設置一個屬性,而不是該數組的一個元素。這意味着使用Array.forEach()時,「關聯鍵」不會被迭代,並且在計算Array.length時不會被包含。如果你想「關聯數組」使用下面提到的對象。如果你想看看一個對象是否有屬性,請參閱這個答案:http://stackoverflow.com/questions/135448/how-do-i-check-if-an-object-has-a-property-in- javascript – Omn 2015-01-04 03:19:08

回答

39

使用in關鍵字測試如果一個屬性在一個對象

if (assoc_var in assoc_pagine) 

OR

if ("home" in assoc_pagine) 

這裏有相當多的問題定義。

首先,是var假定變量的值爲「home」,「work」或「about」?或者你是否想要檢查名爲「var」的實際屬性?

如果var應該是一個具有字符串值的變量,請注意,var是JavaScript中的保留字,您需要使用其他名稱,例如assoc_var

var assoc_var = "home"; 
assoc_pagine[assoc_var] // equals 0 in your example 

如果您打算檢查名爲「var」的屬性,那麼您簡單地需要將它放在引號內。

assoc_pagine["var"] 

然後,undefined是不一樣的"undefined"。您將需要typeof以獲取對象類型的字符串表示形式。

這是所有步驟的細分。

var assoc_var = "home"; 
var value = assoc_pagine[assoc_var]; // 0 
var typeofValue = typeof value; // "number" 

因此,要解決您的問題

if (typeof assoc_pagine[assoc_var] != "undefined") 

更新:至於其他的答案表明,使用陣列是不是這個問題的最佳sollution。考慮使用對象代替。

var assoc_pagine = new Object(); 
assoc_pagine["home"]=0; 
assoc_pagine["about"]=1; 
assoc_pagine["work"]=2; 
+0

*「'var'是JavaScript中的保留字」*應該是第一個 – jozxyqk 2013-12-07 09:21:19

+0

@jozxqk,固定。和一些清理。 – Stefan 2014-01-28 09:21:57

+3

-1這是一團糟。真的很難從中得到答案。我想知道的是如何檢查是否在Javascript中設置了數組項。這是我尋找的答案,這是一個非常低質量的答案。 – 2014-03-25 04:47:04

5

var是一個語句...所以這是一個保留字......所以只是把它的另一種方式。 這就是做一個更好的方式(===比==更好)

if(typeof array[name] !== 'undefined') { 
    alert("Has var"); 
} else { 
    alert("Doesn't have var"); 
} 
+0

有人能解釋我爲什麼我是-2嗎? – xavierm02 2010-04-10 17:01:23

+0

同樣的答案,同樣的問題。大聲笑..我猜他們不喜歡簡單的答案... – Stefan 2010-09-05 08:21:03

+0

+1感謝您的簡單回答 – 2014-03-25 04:47:29

11
var assoc_pagine = new Array(); 
assoc_pagine["home"]=0; 

不要使用此一Array。數組用於數字索引列表。只需使用普通的Object{})。

你所用'undefined'串想着大概是這樣的:

if (typeof assoc_pagine[key]!=='undefined') 

這話說

if (assoc_pagine[key]!==undefined) 

然而,無論哪種方式,這是一個有點(或多或少)相同醜陋。您正在取消引用可能不存在的關鍵字(這在任何更明智的語言中都是錯誤的),並且依賴於JavaScript的奇怪黑客手段,爲您提供不存在的屬性的特殊undefined值。

這也不完全告訴你,如果屬性真的不是那裏,或者如果它存在但明確設置爲undefined值。

這是一個更加明確,可讀性和IMO全方位的更好的方法:

if (key in assoc_pagine) 
+0

似乎解決了使用數組作爲關聯數組的明顯問題的唯一答案。 +1 – James 2010-04-10 12:10:02

+0

(之前說過,它*做*工作,因爲Array是Object的一個子類,除了在原型上加載更多屬性可能會與之衝突之外,它並沒有給你任何東西。 – bobince 2010-04-10 12:32:27

+0

你想使用'hasOwnProperty'not'in',因爲'in'也檢查繼承的屬性。 (例如{}中的hasOwnProperty === true) – Omn 2015-01-21 20:19:03

3

這不是一個數組。 更好的聲明這樣說:

var assoc_pagine = {}; 
assoc_pagine["home"]=0; 
assoc_pagine["about"]=1; 
assoc_pagine["work"]=2; 

var assoc_pagine = { 
       home:0, 
       about:1, 
       work:2 
       }; 

要檢查的對象包含了一些標籤,你只需做這樣的事情:

if('work' in assoc_pagine){ 
    // do your thing 
}; 
+0

哎呀,忽略Bobinces的答案,它告訴你所有並且比你想知道的更多 – KooiInc 2010-04-10 15:18:37

+0

這個答案確實解決了OP所需的使用情況,但是你想使用'hasOwnProperty ''in'since'也會檢查繼承的屬性。 (例如{}中的hasOwnProperty === true) – Omn 2015-01-21 20:13:39

0
function isset(key){ 
ret = false; 
array_example.forEach(function(entry) { 
    if(entry == key){ 
    ret = true; 
    } 
}); 
return ret; 
} 

alert(isset("key_search")); 
+0

這根本不起作用。 – Omn 2015-01-04 06:47:58

1

TLDR;我能想出的最好的是這樣的:(根據您的使用情況下,有許多的方法來優化該功能。)

function arrayIndexExists(array, index){ 
    if (typeof index !== 'number' && index === parseInt(index).toString()) { 
     index = parseInt(index); 
    } else { 
     return false;//to avoid checking typeof again 
    } 
    return typeof index === 'number' && index % 1===0 && index >= 0 && array.hasOwnKey(index); 
} 

對方回答的例子親近,將一些工作(可能是最)的目的,但在技術上相當不正確,我下面解釋的原因。

Javascript數組只使用'數字'鍵。在數組上設置「關聯鍵」時,實際上是在該數組對象上設置一個屬性,而不是該數組的一個元素。例如,這意味着當使用Array.forEach()時,「關聯密鑰」不會被迭代,並且在計算Array.length時不會被包含。 (例外是這樣的字符串'0'將解析爲數組的元素,但'0'字符串不會)。

此外,檢查不存在的數組元素或對象屬性會評估因爲未定義,但實際上並沒有告訴你數組元素或對象屬性尚未設置。例如,未定義也是通過調用不以return語句終止的函數得到的結果。這可能會導致一些奇怪的錯誤和難以調試的代碼。

這可能令人困惑,但可以使用瀏覽器的javascript控制檯輕鬆探索。 (我使用了chrome,每個註釋都表示它之前的行的評估值)。

var foo = new Array(); 
foo; 
//[] 
foo.length; 
//0 
foo['bar'] = 'bar'; 
//"bar" 
foo; 
//[] 
foo.length; 
//0 
foo.bar; 
//"bar" 

這表明關聯鍵不用於訪問數組中的元素,而是用於對象的屬性。

foo[0] = 0; 
//0 
foo; 
//[0] 
foo.length; 
//1 
foo[2] = undefined 
//undefined 
typeof foo[2] 
//"undefined" 
foo.length 
//3 

這表明檢查typeof不允許您查看是否設置了元素。

var foo = new Array(); 
//undefined 
foo; 
//[] 
foo[0] = 0; 
//0 
foo['0'] 
//0 
foo[' 0'] 
//undefined 

這說明我上面提到的例外,爲什麼你不能只使用parseInt函數();

如果你想使用關聯數組,你最好使用簡單的對象作爲其他答案的建議。