2010-04-10 21 views
20

में सेट किया गया है मैं एक सरणीचेक अगर एक सरणी आइटम जे एस

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

मैं

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

की कोशिश की लेकिन यह

मैं उपयोग कर रहा हूँ काम करने के लिए प्रतीत नहीं होता है jquery, मुझे नहीं पता कि यह

धन्यवाद

+2

जावास्क्रिप्ट में Arrays सहयोगी कुंजी का उपयोग नहीं करते हैं। जब आप किसी सरणी पर "सहयोगी कुंजी" सेट करते हैं, तो आप वास्तव में उस सरणी ऑब्जेक्ट पर एक प्रॉपर्टी सेट कर रहे हैं, न कि उस सरणी का तत्व। इसका मतलब है कि "सहयोगी कुंजी" Array.forEach() का उपयोग करते समय पुनरावृत्त नहीं किया जाएगा और Array.length की गणना करते समय शामिल नहीं किया जाएगा। यदि आप चाहते हैं कि "सहयोगी सरणी" नीचे उल्लिखित वस्तु का उपयोग करें। यदि आप देखना चाहते हैं कि किसी ऑब्जेक्ट में कोई संपत्ति है, तो यह उत्तर देखें: http://stackoverflow.com/questions/135448/how-do-i-check-if-an-object-has-a-property-in- जावास्क्रिप्ट – Omn

उत्तर

39

परीक्षण करने के लिए in कीवर्ड का प्रयोग करें, तो एक विशेषता एक वस्तु

if (assoc_var in assoc_pagine) 

या

if ("home" in assoc_pagine) 

यहां काफी कुछ मुद्दे हैं में परिभाषित किया गया है।

सबसे पहले, var है कि एक चर के मान में "घर", "काम" या "लगभग" मूल्य है? या आप "var" नामक वास्तविक संपत्ति का निरीक्षण करने का मतलब था?

var एक चर एक स्ट्रिंग मान है कि माना जाता है, तो ध्यान दें var जावास्क्रिप्ट में एक आरक्षित शब्द है कि और आप assoc_var के रूप में एक और नाम है, इस तरह का उपयोग करने की आवश्यकता होगी।

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

आप संपत्ति "var" कहा जाता है का निरीक्षण करने के लिए होती है, तो आप साधारण जरूरत उद्धरण के अंदर डाल दिया।

assoc_pagine["var"] 

फिर, undefined"undefined" के रूप में ही नहीं है। ऑब्जेक्ट प्रकार की स्ट्रिंग प्रस्तुति प्राप्त करने के लिए आपको typeof की आवश्यकता होगी।

यह सभी चरणों का एक खंड है। , के रूप में अन्य उत्तर संकेत दिया है एक सरणी इस समस्या के लिए सबसे अच्छा sollution नहीं है का उपयोग करते हुए:

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

तो

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

अद्यतन आपकी समस्या को ठीक करने के लिए। इसके बजाय ऑब्जेक्ट का उपयोग करने पर विचार करें।

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

* "' var' जावास्क्रिप्ट में एक आरक्षित शब्द है "* पहले – jozxyqk

+0

@jozxqk होना चाहिए, निश्चित। और सफाई का थोड़ा सा। – Stefan

+3

-1 यह एक गड़बड़ है। इसका जवाब पाने में वाकई मुश्किल है। मैं जानना चाहता हूं कि यह देखने के लिए कैसे जांचें कि जावास्क्रिप्ट में कोई सरणी आइटम सेट है या नहीं। यही वह है जिसे मैंने इस उत्तर को खोजने के लिए खोजा, और यह बहुत कम गुणवत्ता वाला उत्तर है। –

5

var एक कथन है ... तो यह एक आरक्षित शब्द है ... तो बस इसे एक और तरीका कहें। और है कि यह ऐसा करने का एक बेहतर तरीका है

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

क्या कोई मुझे समझा सकता है कि मैं -2 क्यों हूं? – xavierm02

+0

एक ही जवाब, एक ही समस्या। lol .. मुझे लगता है कि उन्हें सरल उत्तर पसंद नहीं हैं ... – Stefan

+0

+1 सरल उत्तर –

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

इस के लिए एक Array का प्रयोग न करें (=== == से बेहतर है)। Arrays संख्यात्मक रूप से अनुक्रमित सूचियों के लिए हैं। बस एक सादा Object ({}) का उपयोग करें।(कम या ज्यादा) एक ही

if (assoc_pagine[key]!==undefined) 

हालांकि, किसी भी तरह से यह कहते हुए इस एक सा है के रूप में

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

यह वह जगह है:

क्या आप 'undefined' तार के साथ के बारे में सोच रहे हैं शायद यह है बदसूरत। आप एक कुंजी को संदर्भित कर रहे हैं जो मौजूद नहीं हो सकता है (जो किसी और समझदार भाषा में एक त्रुटि होगी), और गैर-मौजूद गुणों के लिए आपको विशेष undefined मान देने के जावास्क्रिप्ट के अजीब हैक पर निर्भर है।

यह आपको यह भी नहीं बताता है कि संपत्ति वास्तव में नहीं थी, या यदि यह वहां थी लेकिन स्पष्ट रूप से undefined मान पर सेट किया गया था।

if (key in assoc_pagine) 
+0

एकमात्र ऐसा उत्तर जो एक एसोसिएटिव सरणी के रूप में सरणी का उपयोग करने की स्पष्ट समस्या को संबोधित करता है। +1 – James

+0

(यह कहकर, यह * काम * करता है, क्योंकि 'ऐरे' ऑब्जेक्ट का उप-वर्ग है। यह आपको प्रोटोटाइप पर संभावित रूप से संघर्ष करने के लिए लोड और अधिक गुणों के अलावा कुछ भी नहीं प्राप्त करता है।) – bobince

+0

आप 'हैऑनप्रॉपर्टी' का उपयोग नहीं करना चाहते हैं क्योंकि 'इन' में 'विरासत' के लिए भी जांच की जाती है। (उदाहरण के लिए {} === सत्य में हैऑनप्रॉपर्टी) – Omn

3

यह एक सरणी नहीं है:

यह एक है, और अधिक स्पष्ट पठनीय और IMO चौतरफा बेहतर तरीका है। बेहतर इस तरह यह घोषणा:

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

ओह, बॉबिनिस का जवाब अनदेखा करता है, जो आपको – KooiInc

+0

को जानना चाहता था उससे अधिक आपको बताता है यह उत्तर OP द्वारा आवश्यक उपयोग किए गए उपयोग को संबोधित करता है, हालांकि आप 'हैऑनप्रॉपर्टी' 'से' में 'नहीं' में 'विरासत में संपत्तियों की जांच भी होती है। (उदाहरण के लिए {} === सत्य में हैऑनप्रॉपर्टी) – Omn

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

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

यह बिल्कुल काम नहीं करता है। – Omn

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); 
} 

अन्य जवाब के उदाहरण करीब हो और (शायद सबसे कुछ के लिए काम करेंगे (आपके उपयोग के मामले के आधार पर, वहाँ तरीके इस समारोह का अनुकूलन करने के एक नंबर रहे हैं।)) उद्देश्यों, लेकिन नीचे बताए गए कारणों के लिए तकनीकी रूप से काफी गलत हैं।

जावास्क्रिप्ट सरणी केवल 'संख्यात्मक' कुंजी का उपयोग करें। जब आप किसी सरणी पर "सहयोगी कुंजी" सेट करते हैं, तो आप वास्तव में उस सरणी ऑब्जेक्ट पर एक प्रॉपर्टी सेट कर रहे हैं, न कि उस सरणी का तत्व। उदाहरण के लिए, इसका मतलब है कि "सहयोगी कुंजी" Array.forEach() का उपयोग करते समय पुनरावृत्त नहीं किया जाएगा और Array.length की गणना करते समय शामिल नहीं किया जाएगा। (इसके लिए अपवाद '0' जैसे स्ट्रिंग सरणी के तत्व को हल करेगा, लेकिन '0' जैसे तार नहीं होंगे।)

इसके अतिरिक्त, सरणी तत्व या ऑब्जेक्ट प्रॉपर्टी की जांच करना जो मौजूद नहीं है मूल्यांकन करता है अपरिभाषित के रूप में, लेकिन यह वास्तव में आपको नहीं बताता है कि सरणी तत्व या वस्तु गुण अभी तक सेट नहीं किया गया है। उदाहरण के लिए, अपरिभाषित परिणाम भी आपको एक फ़ंक्शन को कॉल करके मिलता है जो रिटर्न स्टेटमेंट को समाप्त नहीं करता है। यह कुछ अजीब त्रुटियों और डीबगिंग कोड में कठिनाई का कारण बन सकता है।

यह भ्रमित हो सकता है, लेकिन आपके ब्राउज़र के जावास्क्रिप्ट कंसोल का उपयोग करके बहुत आसानी से खोजा जा सकता है। (मैंने क्रोम का इस्तेमाल किया, प्रत्येक टिप्पणी इससे पहले लाइन के मूल्यांकन मूल्य को इंगित करती है।);

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 उपयोग नहीं कर सकते();

यदि आप सहयोगी सरणी का उपयोग करना चाहते हैं, तो आप सरल वस्तुओं का उपयोग करना बेहतर कर सकते हैं क्योंकि अन्य उत्तरों की सिफारिश की गई है।

संबंधित मुद्दे