2008-10-20 4 views
61

मेरे जेएसओएन कॉल का आउटपुट या तो ऐरे या हैश हो सकता है। मैं इन दोनों के बीच अंतर कैसे करूं?जावास्क्रिप्ट में हम कैसे पहचान सकते हैं कि कोई ऑब्जेक्ट हैश या ऐरे है?

function isObject (obj) { 
    return obj && (typeof obj === "object"); 
} 

सरणी है:

उत्तर

106

आधुनिक ब्राउज़रों Array.isArray(obj) विधि का समर्थन।

See MDN दस्तावेज़ीकरण और पॉलीफिल के लिए। वस्तु पर "निर्माता" संपत्ति के लिए

if(output.constructor == Array){ 
} 
else if(output.constructor == Object){ 
} 
+2

इसमें विभिन्न पृष्ठों के बीच संघर्ष की संभावना है, क्योंकि दोनों के पास 'ऐरे' और 'ऑब्जेक्ट' कन्स्ट्रक्टर फ़ंक्शंस के अलग-अलग उदाहरण हैं, जो बराबर की तुलना नहीं करेंगे। मुझे पूरा यकीन नहीं है कि एक उदाहरण कैसे उत्पन्न किया जाए जो इसे प्रदर्शित करता है, लेकिन मैंने इसे कहीं पढ़ा है। – ripper234

+1

@ ripper234 समस्या स्वयं को एक बहु 'विंडो' वातावरण में प्रकट करेगी। Array.isArray metioning के लिए – alex

+2

+1। Borwser समर्थन के लिए इस लिंक को देखें: http://kangax.github.io/compat-table/es5/#Array.isArray – SKuijers

25

वस्तु है

function isArray (obj) { 
    return isObject(obj) && (obj instanceof Array); 
} 

क्योंकि सरणियों वस्तुओं आप अगर एक चर एक सरणी पहला है, और फिर अगर यह एक वस्तु है परीक्षण करने के लिए करना होगा:

if (isArray(myObject)) { 
    // do stuff for arrays 
} 
else if (isObject(myObject)) { 
    // do stuff for objects 
} 
+0

अच्छा जवाब। आप प्रत्येक जेएस वस्तु को जोड़ना चाह सकते हैं जिसे हैश के रूप में माना जा सकता है। – Rontologist

+0

isObject (नई तिथि())) सत्य है, लेकिन इस प्रश्न के अर्थ में एक तारीख वस्तु/हैश नहीं है। बेशक हम इसे JSON पर लागू करते हैं, लेकिन विधि का नाम वास्तव में भ्रमित है। – schirrmacher

0

की जांच:

= =

से मूल जवाब आप अपने उत्पादन का constuctor संपत्ति का उपयोग कर सकते हैं। यह ऐरे है - यह एक सरणी वस्तु है।

 

var a = { 
'b':{length:0}, 
'c':[1,2] 
} 

if (a.c.constructor == Array) 
    for (var i = 0; i < a.c.length; i++) 
     alert(a.c[i]); 
else 
    for (var s in a.b); 
     alert(a.b[s]); 

8

क्या आपका मतलब "हैश" के बजाय "ऑब्जेक्ट" था?

>>> var a = []; 
>>> var o = {}; 
>>> a instanceof Array 
true 
>>> o instanceof Array 
false 
5

मैंने यह निर्धारित करने के लिए एक कार्य किया है कि यह एक शब्दकोश है या नहीं।

exports.is_dictionary = function (obj) { 
    if(!obj) return false; 
    if(Array.isArray(obj)) return false; 
    if(obj.constructor != Object) return false; 
    return true; 
}; 

// return true 
test.equal(nsa_utils.is_dictionary({}), true); 
test.equal(nsa_utils.is_dictionary({abc:123, def:456}), true); 

// returns false 
test.equal(nsa_utils.is_dictionary([]), false); 
test.equal(nsa_utils.is_dictionary([123, 456]), false); 
test.equal(nsa_utils.is_dictionary(null), false); 
test.equal(nsa_utils.is_dictionary(NaN), false); 
test.equal(nsa_utils.is_dictionary('hello'), false); 
test.equal(nsa_utils.is_dictionary(0), false); 
test.equal(nsa_utils.is_dictionary(123), false); 
+0

इसके लिए धन्यवाद। इसने उपर्युक्त मामलों के लिए काम किया है। मुझे अभी तक एक ऐसे मामले में आना है जहां आपकी विधि विफल हो। – Nav

0

json पार्स करने में आ सकता है के लिए काम :)

isArrayHashs = (attr) -> 
    !!attr && attr.constructor == Array && isHash(attr[0]) 

isHash = (attr) -> 
    !!attr && !$.isNumeric(attr) && attr.constructor == Object 

attr [0] .constructor होना चाहिए:

  • स्ट्रिंग
  • संख्यात्मक
  • सरणी
  • ऑब्जेक्ट
  • अपरिभाषित
संबंधित मुद्दे

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