यदि ऑब्जेक्ट एक सरणी है तो कैसे जांचें?


2749

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

अगर चर एक सरणी है तो मैं कैसे जांच सकता हूं?


मैंने नीचे दिए गए विभिन्न समाधानों को गोल किया है और एक jsperf परीक्षण बनाया है । वे सभी तेज़ हैं, इसलिए बस उपयोग करें Array.isArray- यह अब अच्छी तरह से समर्थित है और फ्रेम भर में काम करता है


6
मुझे लगा कि आप का मतलब है कि 'ऑब्जेक्ट एरे' है या नहीं, लेकिन आप चेक करना चाहते हैं कि 'ऑब्जेक्ट स्ट्रिंग्स या सिंगल स्ट्रिंग' है या नहीं। यकीन नहीं होता तो देख लेंगे? या यह सिर्फ मैं हूं? मैं इस तरह से कुछ और सोच रहा था ... क्या मैं यहाँ कुछ याद कर रहा हूँ?
rr1g0

149
टीएल; डीआर - arr.constructor === Arrayसबसे तेज है।
नेटा

3
jsben.ch/#/QgYAV - सबसे सामान्य तरीकों के लिए एक बेंचमार्क
एस्केपनेटऑक्ट

39
टीएल; डीआर - ऐरे। ES5 के बाद से ऐरे (गिरफ्तार) ; और $। isArray (arr) jQuery में।
ओंद्र kaसुका

6
बस ध्यान रखें कि यदि आप किसी भी कारण से अपने निर्माता को प्रोटोटाइप के माध्यम से ओवरराइट करते हैं तो arr.constructor === Arrayपरीक्षण गलत वापस आ जाएगा। Array.isArray(arr)हालांकि अभी भी सही है।
भूतकाल

जवाबों:


975

आधुनिक ब्राउज़रों में आप कर सकते हैं

Array.isArray(obj)

( क्रोम 5, फ़ायरफ़ॉक्स 4.0, आईई 9, ओपेरा 10.5 और सफारी 5 द्वारा समर्थित )

पिछड़े संगतता के लिए आप निम्नलिखित जोड़ सकते हैं

# only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

यदि आप jQuery का उपयोग करते हैं तो आप उपयोग कर सकते हैं jQuery.isArray(obj)या $.isArray(obj)। यदि आप अंडरस्कोर का उपयोग करते हैं तो आप उपयोग कर सकते हैं_.isArray(obj)

यदि आपको विभिन्न फ़्रेमों में निर्मित सरणियों का पता लगाने की आवश्यकता नहीं है, तो आप बस उपयोग भी कर सकते हैं instanceof

obj instanceof Array

9
यहां उन ब्राउज़रों की एक पूरी सूची है जो समर्थन करते हैंArray.isArray
lightswitch05

if (typeof Array.isArray === 'undefined') {बदला जा सकता हैif(!Array.isArray) {
iMatoria

यदि इसके लायक Object.prototype.string.call(obj)वस्तु है Symbol.toStringTag, तो इसे खराब किया जा सकता है। उन्होंने कहा कि मुझे ऐसे किसी भी पर्यावरण के बारे में जानकारी नहीं है जो जहाज करता है Symbol.toStringTagलेकिन Array.isArrayऐसा नहीं है यह सुरक्षित लगता है।
बेंजामिन ग्रुएनबाम

5
instanceof Arrayयदि सरणी किसी भिन्न फ़्रेम से है तो विफल क्यों होता है?
नोबल उत्थान

16
@ नोबल अपलिफ्ट: instanceof Arrayयदि सरणी किसी भिन्न फ्रेम से है तो विफल रहता है क्योंकि उस भिन्न फ्रेम के प्रत्येक सरणी में एक अलग Arrayकंस्ट्रक्टर और प्रोटोटाइप होता है। अनुकूलता / सुरक्षा कारणों से, हर फ्रेम का अपना वैश्विक वातावरण होता है, और इसमें वैश्विक वस्तुएँ शामिल होती हैं। Objectएक फ्रेम से वैश्विक से अलग है Objectदूसरे से वैश्विक। तो Arrayग्लोबल्स के लिए भी । एक्सल रौशमायर इस बारे में अधिक बातचीत करते हैं
jschoi

1943

ECMAScript मानक में ऑब्जेक्ट के वर्ग को खोजने के लिए दी गई toStringविधि से विधि का उपयोग करना है Object.prototype

if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
    alert( 'Array!' );
}

या आप typeofपरीक्षण कर सकते हैं कि क्या यह एक स्ट्रिंग है:

if( typeof someVar === 'string' ) {
    someVar = [ someVar ];
}

या यदि आप प्रदर्शन के बारे में चिंतित नहीं हैं, तो आप बस concatएक नए खाली एरे के लिए कर सकते हैं।

someVar = [].concat( someVar );

इसमें कंस्ट्रक्टर भी है जिसे आप सीधे क्वेरी कर सकते हैं:

if (somevar.constructor.name == "Array") {
    // do something
}

@TJ Crowder के ब्लॉग से एक संपूर्ण उपचार देखें , जैसा कि नीचे उनकी टिप्पणी में पोस्ट किया गया है।

यह मानदंड प्राप्त करने के लिए कि कौन सी विधि बेहतर प्रदर्शन करती है: http://jsben.ch/#/QgYAV देखें

से @Bharath ES6 प्रयोग करने के लिए प्रश्न पूछा सरणी के लिए परिवर्तित स्ट्रिंग:

const convertStringToArray = (object) => {
   return (typeof object === 'string') ? Array(object) : object 
}

मान लीजिए:

let m = 'bla'
let n = ['bla','Meow']
let y = convertStringToArray(m)
let z = convertStringToArray(n)
console.log('check y: '+JSON.stringify(y)) . // check y: ['bla']
console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']

65
+1 युप, toStringजाने के तरीकों में से एक है। मैं यहाँ पर एक राउंडअप करता हूँ: blog.niftysnippets.org/2010/09/say-what.html
TJ Crowder

3
typeof new String('beans') > 'ऑब्जेक्ट'
बेन

16
यदि आप "[ऑब्जेक्ट एरे] टाइप नहीं करना चाहते हैं, तो ऑब्जेक्ट का उपयोग करें। 'Object.prototype.toString.call टाइप करना चाहते हैं
प्रमोद

13
मैं वेनिला Array.isArray का उपयोग करता हूं जो 'आधुनिक ब्राउज़रों' (यानी IE9 + और बाकी सभी) में काम करता है। और पुराने ब्राउज़र समर्थन के लिए MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
डेविड गिल्बर्टसन

21
आधुनिक दुनिया में जीते -Array.isArray(obj)
mcfedr

1274

यदि आपका कार्यान्वयन समर्थन करता है, तो मैं सबसे पहले जाँच करूँगा isArray:

if (Array.isArray)
    return Array.isArray(v);

आप instanceofऑपरेटर का उपयोग करके भी देख सकते हैं

v instanceof Array

127
v instanceof Arrayयदि vदूसरा फ्रेम में बनाया गया था तो वह गलत हो जाएगा ( वर्ग vका उदाहरण thatFrame.contentWindow.Array)।
पेप्किन p

47
विशिष्ट होने के लिए: Array.isArrayECMAScript 5 / जावास्क्रिप्ट 1.8.5 के भाग के रूप में परिभाषित किया गया है।
जेवॉन

8
वास्तव में सरल और साफ समाधान BUT isArray कुछ पुराने ब्राउज़रों (IE7 और IE8) के साथ संगत नहीं है। स्रोत: kangax.github.io/es5-compat-table/#
Wookie88

2
कैसे के बारे में: अगर (Array.isArray) Array.isArray (v) वापस करें; और वापसी v Instof ऐरे;
lewdev

1
या बस:return (Array.isArray && Array.isArray(v)) || (v instanceof Array);
स्टिज डे विट

298

jQuery भी एक $.isArray()विधि प्रदान करता है:

var a = ["A", "AA", "AAA"];

if($.isArray(a)) {
  alert("a is an array!");
} else {
  alert("a is not an array!");
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


27
बस एक नोट, jQuery का उपयोग करता है .String विधि आंतरिक रूप से: GitHub स्रोत
याकूब स्क्वायर्स

5
@JacobSquires यह निर्भर करता है। मैंने अभी यहां परीक्षण किया है, क्रोम पर नवीनतम jQuery - $.isArray === Array.isArrayसच लौट रहा है।
रेनन

3
@ रेनन: यह jQuery का उपयोग करने के बारे में अच्छी बात है। यह आमतौर पर इसे करने के लिए सबसे आधुनिक और सबसे अच्छी विधि का उपयोग करता है, और आपको यह जानने के लिए कि क्या उपयोग करना है, यह जानने के लिए आपको खुद को जांचने की सभी सुविधा नहीं करनी है।
विस्मय में

jQuery Array.isArrayपर्दे के पीछे उपयोग कर रहा है: github.com/jquery/jquery/blob/master/src/core.js#L211
Sergiu

1
लेकिन कोई भी इस कार्यक्षमता के लिए jQuery JUST का उपयोग करने वाला नहीं है, है ना? मैं सिर्फ jquery डाउनलोड नहीं करूंगा क्योंकि मैं जांचना चाहता हूं कि क्या कोई चीज़ है: p
आटोमैगिश

106

यह सभी विधियों (समर्थित सभी ब्राउज़र) में सबसे तेज़ है:

function isArray(obj){
    return !!obj && obj.constructor === Array;
}

2
आप सही कह रहे हैं, यह उस सवाल के अनुसार सबसे तेज़ है जो मैंने शामिल किया था।
एमपीएन

5
क्या इस पद्धति का उपयोग करने के लिए कोई डाउनसाइड है? यह स्वीकृत, शीर्ष उत्तर की तुलना में बहुत अधिक सरल और प्रभावी लगता है।
डेविड मेजा

@ शिनोबी - बस जिज्ञासु (और मैंने इसे अक्सर देखा है) - आप इस शर्त का if (obj && Array === obj.constructor)विरोध क्यों करते हैं if (obj && obj.constructor === Array)? क्या यह अंग्रेजी में अनुवाद में खो गया है, फिर बात को कोड करने के लिए? उदाहरण के लिए, अंग्रेजी बोलने वाले आमतौर पर यह पूछते हैं कि "क्या वस्तु मौजूद है, और क्या यह कंस्ट्रक्टर एरे क्लास से आया है?", इसलिए इसे पढ़ते समय कोड प्रवाह अधिक तार्किक होता है। या कोई तकनीकी कारण है?
unsynchronized

function object_type(o){var t = typeof(o);return ((t==="object") && (o.constructor===Array)) ? "array" : t;} /*allows you to */ switch(object_type(o)){ case 'array': break; case 'object' : o.dosomething();}
असुरक्षित

3
@ शशिनोबी सब अच्छा है। मुझे लगता है कि यह एक सुरक्षित सी आदत से एक हैंगओवर हो सकता है - यदि आप गलती से = == का उपयोग करते हैं, तो यह एक नियत चर के रूप में संकलित नहीं होगा।
असुरक्षित

47

आप नीचे इस सरणी है कल्पना कीजिए :

var arr = [1,2,3,4,5];

जावास्क्रिप्ट (नए और पुराने ब्राउज़र):

function isArray(arr) {
  return arr.constructor.toString().indexOf("Array") > -1;
}

या

function isArray(arr) {
  return arr instanceof Array;
}

या

function isArray(arr) {
  return Object.prototype.toString.call(arr) === '[object Array]';
}

तो इसे इस तरह से कॉल करें:

isArray(arr);

जावास्क्रिप्ट (IE9 +, Ch5 +, FF4 +, Saf5 +, Opera10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

कोणीय:

angular.isArray(arr);

अंडरस्कोर और लॉडश:

_.isArray(arr);

34

Array.isArray तेजी से काम करता है, लेकिन यह ब्राउज़र के सभी संस्करणों द्वारा समर्थित नहीं है। तो आप दूसरों के लिए एक अपवाद बना सकते हैं और सार्वभौमिक विधि का उपयोग कर सकते हैं:

    Utils = {};    
    Utils.isArray = ('isArray' in Array) ? 
        Array.isArray : 
        function (value) {
            return Object.prototype.toString.call(value) === '[object Array]';
        }

3
आपको .toString()विधि प्राप्त करने की आवश्यकता है Object.prototype। अभी आप उपयोग कर रहे हैं window.toString(), जो समान नहीं है।
को सिस्टम

तुम सही हो। क्रोम में window.toStringही करें Object.prototype.toString
क्रूवर्ल्ट

isArray बिल्कुल तेज नहीं है। यह सबसे धीमी विधि है।
jemiloii

केवल यूटील के बजाय एरे में इसे क्यों न जोड़ें? (मुझे पता है कि आप नए सरणी ऑब्जेक्ट्स पर अतिरिक्त गुण नहीं चाहते हैं, लेकिन मुझे लगता है कि केवल तभी होता है जब आप ऐरे -प्रोटोटाइप में ऐरे को जोड़ते हैं।)
डेविड विनीकी

27

इसे जांचने का सरल कार्य:

function isArray(object)
{
    return object.constructor === Array;
}

16
मैं इसे एक पंक्ति में कम return object.constructor === Arrayकर दूंगा - लेकिन क्या आपको यकीन है कि यह केवल सरणियों के लिए सही होगा?
मिपेन

12
सभी बूलियन अभिव्यक्तियों के साथ ऐसा कर सकते हैं। जब मैं देखता हूं तो मुझे पागल कर देता है if(x) return true; else return false:-) भले ही यह पीछे की ओर हो, आपको अभिव्यक्ति को नकारना चाहिए।
18

3
इसका कारण getElementsByTagName के लिए सही नहीं है, क्योंकि उस फ़ंक्शन का परिणाम वास्तव में HTMLCollection है, न कि कोई सरणी।
युवल ए।

6
यह बुरी तरह से विफल रहता है यदि ऑब्जेक्ट अपरिभाषित या अशक्त है।
जॉन हेनकेल

1
@JohnHenckel मेरा उत्तर देखें stackoverflow.com/a/29400289/34806 यह आपकी चिंता के साथ-साथ बहुत ही पहली टिप्पणी, सभी को एक लाइन में
लेता है

17

जैसा कि एमडीएन यहां कहता है :

Array.isArray या Object.prototype.toString.call का उपयोग करें, एरे से नियमित ऑब्जेक्ट को अलग करने के लिए

ऐशे ही:

  • Object.prototype.toString.call(arr) === '[object Array]', या

  • Array.isArray(arr)


17

इस प्रश्न के लिए सिर्फ एक लाइन समाधान है

x instanceof Array

जहां x वैरिएबल है, अगर यह सही है तो x एक एरे और गलत होगा यदि यह नहीं है।


बहुत क्लीनर और भविष्य सुरक्षित! यह या एक typeofतुलना।
क्रिस्टोकिवि

क्या यह कुछ ऐसा है जिसे ब्राउज़र समर्थन की एक अच्छी मात्रा मिलती है? मुझें यह पसंद है।
डैन ज़ूज़ेविच

1
दुर्भाग्य से, यह वास्तव में एक कोशिश / पकड़ के बिना उपयोगी नहीं है क्योंकि यदि "x" एक ऑब्जेक्ट है जैसे कि {}एक सरणी, तो आपको सिंटैक्स त्रुटि मिलती है।
abalter

15

आप अपने चर के प्रकार की जांच कर सकते हैं कि क्या यह एक सरणी है;

var myArray=[];

if(myArray instanceof Array)
{
....
}

1
कुछ लोगों ने पहले ही उल्लेख किया है instanceof.. मुझे लगता है कि यह कुछ अजीब परिदृश्यों के तहत विफल रहता है।
एमपीएन

15

मैं एक प्रकार की वस्तु का परीक्षण करने के लिए एक समारोह बनाऊंगा जिसके साथ आप काम कर रहे हैं ...

function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; }

// tests
console.log(
  whatAmI(["aiming","@"]),
  whatAmI({living:4,breathing:4}),
  whatAmI(function(ing){ return ing+" to the global window" }),
  whatAmI("going to do with you?")
);

// output: Array Object Function String

तो आप एक सरल लिख सकते हैं यदि कथन ...

if(whatAmI(myVar) === "Array"){
    // do array stuff
} else { // could also check `if(whatAmI(myVar) === "String")` here to be sure
    // do string stuff
}

12

मैं इसे बहुत सरल तरीके से करता हूं। मेरे लिये कार्य करता है। कोई कमियां?

Array.prototype.isArray = true;

a=[]; b={};
a.isArray  // true
b.isArray  // (undefined -> false)

7
मूर्ख द्वारा{isArray:true}
Bergi

JSON.parse(someDataFromElsewhere).items.isArrayसही (डेटा के आधार पर) वापस आ सकता है और अपना कोड तोड़ सकता है।
रॉय टिंकर

12

टिप्पणियों को ध्यान में रखते हुए इस उत्तर को बेहतर बनाने का मेरा प्रयास है :

var isArray = myArray && myArray.constructor === Array;

यह if / else से छुटकारा दिलाता है, और सरणी के अशक्त या अपरिभाषित होने की संभावना के लिए खाता है


कंस्ट्रक्टर
ES5


11

मैंने jsperf फिडेल को दो वैकल्पिक तरीकों के साथ-साथ त्रुटि जाँच के साथ अद्यतन किया है ।

यह पता चला है कि 'ऑब्जेक्ट' और 'एरे' प्रोटोटाइप में एक निरंतर मान को परिभाषित करने वाली विधि अन्य विधियों की तुलना में तेज है। यह कुछ आश्चर्यजनक परिणाम है।

/* Initialisation */
Object.prototype.isArray = function() {
  return false;
};
Array.prototype.isArray = function() {
  return true;
};
Object.prototype._isArray = false;
Array.prototype._isArray = true;

var arr = ["1", "2"];
var noarr = "1";

/* Method 1 (function) */
if (arr.isArray()) document.write("arr is an array according to function<br/>");
if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>");
/* Method 2 (value) - **** FASTEST ***** */
if (arr._isArray) document.write("arr is an array according to member value<br/>");
if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");

यदि चर अपरिभाषित मान लेता है, तो ये दो विधियां काम नहीं करती हैं, लेकिन वे काम करते हैं यदि आप निश्चित हैं कि उनका मूल्य है। यदि मान एक सरणी या एकल मान है, तो प्रदर्शन के साथ जाँच के संबंध में, दूसरा तरीका मान्य तेज़ विधि की तरह दिखता है। यह क्रोम पर 'इंस्टाफॉफ़' की तुलना में थोड़ा तेज़ है, इंटरनेट एक्सप्लोरर, ओपेरा और सफारी (मेरी मशीन पर) में दूसरी सबसे अच्छी विधि के रूप में दो बार तेज है।


9

मुझे पता है, कि लोग किसी तरह के कच्चे जावास्क्रिप्ट दृष्टिकोण की तलाश में हैं। लेकिन अगर आप इसके बारे में कम सोचना चाहते हैं, तो यहां देखें: http://underscorejs.org/#isArray

_.isArray(object) 

यदि वस्तु एक ऐरे है, तो सही है।

(function(){ return _.isArray(arguments); })();
=> false
_.isArray([1,2,3]);
=> true

7
"जब तक फ्रेमवर्क / लाइब्रेरी के लिए एक और टैग भी शामिल नहीं किया जाता है, शुद्ध जावास्क्रिप्ट उत्तर अपेक्षित होता है।"
मिशैल पेरोलाकोव्स्की

5

मैंने जो सबसे अच्छा समाधान देखा है वह टाइपोफ़ के लिए एक क्रॉस-ब्राउज़र प्रतिस्थापन है। यहां एंगस क्रॉल के समाधान की जांच करें

टीएल; डीआर संस्करण नीचे है, लेकिन लेख इस मुद्दे की एक महान चर्चा है इसलिए आपको इसे पढ़ना चाहिए यदि आपके पास समय है।

Object.toType = function(obj) {
    return ({}).toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
}
// ... and usage:
Object.toType([1,2,3]); //"array" (all browsers)

// or to test...
var shouldBeAnArray = [1,2,3];
if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};

5

यहाँ मेरा आलसी दृष्टिकोण है:

if (Array.prototype.array_ === undefined) {
  Array.prototype.array_ = true;
}

// ...

var test = [],
    wat = {};

console.log(test.array_ === true); // true
console.log(wat.array_ === true);  // false

मुझे पता है कि यह प्रोटोटाइप के साथ "खिलवाड़" करने के लिए पवित्र है, लेकिन यह अनुशंसित toStringविधि की तुलना में काफी बेहतर प्रदर्शन करता है

नोट: इस दृष्टिकोण का एक नुकसान यह है कि यह सीमाओं के पार काम नहीं करेगाiframe , लेकिन मेरे उपयोग के मामले के लिए यह एक मुद्दा नहीं है।


अब इसका प्रदर्शन बेहतर नहीं है, कम से कम FF30 पर Ubuntu 64-बिट
टेस्ट 30

2
wat = {array_: true}वस्तुओं से मूर्ख ।
बेर्गी

@ बर्गी: हां, यह स्पष्ट होना चाहिए। यदि आप सेटिंग कर रहे हैं obj.array_ = true, तो आप केवल खुद को बेवकूफ बना रहे हैं ।
नामुएल

@namuol: मैं जरूरी नहीं कि खुद को बेवकूफ बना रहा हूं। अक्सर पर्याप्त वस्तुओं का उपयोग शब्दकोशों के रूप में किया जाता है। cacheखोज परिणामों को याद करने के लिए एक वस्तु के बारे में सोचें जो संपत्ति की कुंजी के रूप में खोज स्ट्रिंग का उपयोग करती है। यदि कोई उपयोगकर्ता खोजता है तो क्या होगा array_? क्या आपकी वस्तु उसके कारण एक सरणी बन जाती है? यह सिर्फ एक बग है।
बेर्गी

@namuol: इसके अलावा, इस दृष्टिकोण के लिए आवश्यक होगा कि सभी शामिल पक्ष (प्रयुक्त पुस्तकालयों सहित) सहमत हो सकते हैं कि .array_इसका उपयोग सरणियों को टैग करने के लिए किया जाता है। यह वास्तव में यहाँ नहीं है, .arrayकुछ भी मतलब हो सकता है। आपको कम से कम एक वर्णनात्मक स्ट्रिंग का उपयोग करना चाहिए, और मनमाने ढंग से उपयोग की अनुपयुक्तता का संकेत देना चाहिए, जैसे .__isArray = true
बेर्गी

5

Stoyan Stefanov की पुस्तक जावास्क्रिप्ट पैटर्न में एक अच्छा उदाहरण है जो सभी संभावित समस्याओं को संभालने के साथ-साथ ECMAScript 5 विधि Array.isArray () का उपयोग करता है

तो यहाँ यह है:

if (typeof Array.isArray === "undefined") {
    Array.isArray = function (arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
    };
}

वैसे, यदि आप jQuery का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं विधि $ .isArray ()


2
+1: सिर्फ एक साधारण क्यों नहीं if(!Array.isArray) {...?
मार्को डेमायो

5

यह जांचने का सबसे आसान और तेज़ तरीका है कि कोई ऑब्जेक्ट एक ऐरे है या नहीं।

 var arr = [];
  arr.constructor.name ==='Array'  //return true;

या

arr.constructor ===Array //return true;

या आप एक उपयोगिता कार्य कर सकते हैं:

function isArray(obj){ return obj && obj.constructor ===Array}

उपयोग:

isArray(arr); //return true

5

निम्नलिखित का उपयोग किया जा सकता है यदि आप जानते हैं कि आपके ऑब्जेक्ट में कॉनैट विधि नहीं है।

var arr = [];
if (typeof arr.concat === 'function') {
    console.log("It's an array");
}


यह एक अच्छी ट्रिक है, लेकिन इसे ओवरराइड किया जा सकता है ... लेकिन ज्यादातर बार इसका परिणाम मिलना चाहिए
अलिर्ज़ा

5

तुम isArray विधि है, लेकिन मैं के साथ जाँच करना पसंद करेंगे

Object.getPrototypeOf(yourvariable) === Array.prototype


आप इसे क्यों पसंद करेंगे?
एमपीएन

@ Object.getPrototypeOf(yourvariable)यह एक ऐरे ऑब्जेक्ट का प्रोटोटाइप लौटाता है। और कोड सबसे तेज़ और सुरक्षित है जिस पर भरोसा करना है।
इस्पात

1
यह करना आसान है: pastebin.com/MP8d5bCE इसके अलावा, क्या आपके पास अपने "सबसे तेज़" दावे का समर्थन करने के लिए प्रदर्शन परीक्षण हैं?
मप्र

4

यदि इस फ़ंक्शन को दिए जाने वाले केवल दो प्रकार के मान स्ट्रिंग या स्ट्रिंग की एक सरणी हैं, तो इसे सरल रखें और typeofस्ट्रिंग संभावना के लिए एक चेक का उपयोग करें:

function someFunc(arg) {
    var arr = (typeof arg == "string") ? [arg] : arg;
}

हाँ ... जो इस परिदृश्य के लिए काम करेंगे, लेकिन सामान्य तौर पर नहीं। वैसे भी varargs का उपयोग करके समाप्त हुआ। :)
एमपैन

4
A = [1,2,3]
console.log(A.map==[].map)

यहां सबसे छोटे संस्करण की खोज में मुझे अब तक जो मिला है।

ध्यान दें, कोई सही कार्य नहीं है जो हमेशा सभी संभावित संयोजनों का पता लगाएगा। जादू उपकरण की अपेक्षा आपके उपकरणों की सभी क्षमताओं और सीमाओं को जानना बेहतर है।


1
मेरी थोड़ी व्युत्पत्ति A.map !== undefinedलेकिन हाँ, कि बंदर चिथड़े की दुनिया में फिसलन भरी सड़क हो सकती है;)
dmi3y

FYI करें: यह iFrames ( stackoverflow.com/questions/460256/… ) पर काम नहीं करता है
WiredPrairie

4
function isArray(value) {
    if (value) {
        if (typeof value === 'object') {
            return (Object.prototype.toString.call(value) == '[object Array]')
        }
    }
    return false;
}

var ar = ["ff","tt"]
alert(isArray(ar))

4

परीक्षण के लिए एक सरल कार्य यदि इनपुट मान एक सरणी है तो निम्नलिखित है:

function isArray(value)
{
  return Object.prototype.toString.call(value) === '[object Array]';
}

यह क्रॉस ब्राउज़र और पुराने ब्राउज़रों के साथ काम करता है। यह टीजे क्राउडर्स के ब्लॉग पोस्ट से खींचा गया है


4

आप यह कोशिश कर सकते हैं:

var arr = []; (or) arr = new Array();
var obj = {}; (or) arr = new Object();

arr.constructor.prototype.hasOwnProperty('push') //true

obj.constructor.prototype.hasOwnProperty('push') // false

4

यह फ़ंक्शन लगभग किसी भी चीज़ को एक सरणी में बदल देगा:

function arr(x) {
    if(x === null || x === undefined) {
        return [];
    }
    if(Array.isArray(x)) {
        return x;
    }
    if(isString(x) || isNumber(x)) {
        return [x];
    }
    if(x[Symbol.iterator] !== undefined || x.length !== undefined) {
        return Array.from(x);
    }
    return [x];
}

function isString(x) {
    return Object.prototype.toString.call(x) === "[object String]"
}

function isNumber(x) {
    return Object.prototype.toString.call(x) === "[object Number]"
}

यह कुछ नए ब्राउज़र सुविधाओं का उपयोग करता है ताकि आप इसे अधिकतम समर्थन के लिए पॉलीफ़िल करना चाहें।

उदाहरण:

> arr(null);
[]
> arr(undefined)
[]
> arr(3.14)
[ 3.14 ]
> arr(1/0)
[ Infinity ]
> gen = function*() { yield 1; yield 2; yield 3; }
[Function: gen]
> arr(gen())
[ 1, 2, 3 ]
> arr([4,5,6])
[ 4, 5, 6 ]
> arr("foo")
[ 'foo' ]

नायब तार एक सरणी में एक तत्व के बजाय एक वर्ण में परिवर्तित हो जाएंगे। isStringचेक को डिलीट करें यदि आप इसे दूसरे तरीके से पसंद करेंगे।

मैंने Array.isArrayयहां उपयोग किया है क्योंकि यह सबसे मजबूत है और सबसे सरल भी है।


4

आपके मामले में आप ऐरे कीconcat विधि का उपयोग कर सकते हैं जो एकल वस्तुओं के साथ-साथ सरणी (और यहां तक ​​कि संयुक्त) को स्वीकार कर सकती है:

function myFunc(stringOrArray)
{
  var arr = [].concat(stringOrArray);

  console.log(arr);

  arr.forEach(function(item, i)
  {
    console.log(i, "=", item);
  })
}

myFunc("one string");

myFunc(["one string", "second", "third"]);

concat लगता है Array के सबसे पुराने तरीकों में से एक (IE 5.5 इसे अच्छी तरह जानता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.