सवाल जांचें कि ऑब्जेक्ट सरणी है या नहीं?


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

तो मैं कैसे जांचूं कि चर एक सरणी है या नहीं?


मैंने नीचे दिए गए विभिन्न समाधानों को गोल किया है और एक बनाया है जेएसपीआरएफ परीक्षण


2146
2018-01-23 18:53


मूल


मैंने सोचा था कि आप 'ऑब्जेक्ट एक सरणी है या नहीं,' जांचना चाहते थे, लेकिन आप यह जांचना चाहते हैं कि 'ऑब्जेक्ट स्ट्रिंग्स या एक स्ट्रिंग की सरणी है या नहीं।' यकीन नहीं है कि आप इसे देखते हैं? या यह सिर्फ मैं हूं? मैं कुछ और सोच रहा था इस... क्या मैं यहां कुछ खो रहा हूं? - rr1g0
टी एल; डॉ - arr.constructor === Array सबसे तेज़ है - Neta
jsben.ch/#/QgYAV - सबसे आम तरीकों के लिए एक बेंचमार्क - EscapeNetscape
टी एल; डॉ - ऐरे।isArray (आगमन) ईएस 5 के बाद से; और $।isArray (आगमन) jQuery में। - Ondra Žižka
बस ध्यान रखें कि यदि आप किसी भी कारण से प्रोटोटाइप के माध्यम से अपने कन्स्ट्रक्टर को ओवरराइट करते हैं arr.constructor === Array परीक्षा झूठी वापसी होगी। Array.isArray(arr) हालांकि अभी भी सच है। - ghaschel


जवाब:


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

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

319
2018-01-06 18:11



यहां है अधिक पूर्ण समर्थन करने वाले ब्राउज़र की सूची Array.isArray - lightswitch05
if (typeof Array.isArray === 'undefined') { में बदला जा सकता है if(!Array.isArray) { - iMatoria
हांलांकि इसकी कीमत के बारे निश्चित नहीं हूँ Object.prototype.string.call(obj)ऑब्जेक्ट में स्पूफ किया जा सकता है Symbol.toStringTag इस पर। उस ने कहा कि मुझे जहाजों के किसी भी पर्यावरण से अवगत नहीं है Symbol.toStringTag लेकिन नहीं Array.isArray तो यह सुरक्षित लगता है। - Benjamin Gruenbaum


ऑब्जेक्ट की कक्षा को खोजने के लिए ईसीएमएस्क्रिप्ट मानक में दी गई विधि का उपयोग करना है 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
}

एक देखें पूरी तरह से इलाज से @ T.J। 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']

1866
2018-01-23 18:54



+1 यूप, toString जाने के तरीकों में से एक है। मैं यहां एक राउंडअप का थोड़ा सा करता हूं: blog.niftysnippets.org/2010/09/say-what.html - T.J. Crowder
यदि आप "[ऑब्जेक्ट ऐरे]" टाइप नहीं करना चाहते हैं तो ऑब्जेक्ट.प्रोटोटाइप.toString.call (someVar) === ऑब्जेक्ट.प्रोटोटाइप.toString.call ([]) का उपयोग करें या अगर आप डॉन करते हैं तो टाइप करने के लिए एक सुविधा फ़ंक्शन बनाएं Object.prototype.toString.call टाइप नहीं करना चाहता - Pramod
वाह। कॉन्सट विधि एक रोगग्रस्त चूहा है। मैं एक +2 देना चाहता हूं लेकिन इसकी अनुमति नहीं है - Dark Star1
मैं वेनिला Array.isArray का उपयोग करता हूं जो 'आधुनिक ब्राउज़र' (यानी, आईई 9 + और अन्य सभी) में काम करता है। और पुराने ब्राउज़र समर्थन के लिए एमडीएन से शिम का उपयोग करें developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - David Gilbertson
आधुनिक दुनिया में रहते हैं - Array.isArray(obj) - mcfedr


मैं पहले जांच करता हूं कि आपका कार्यान्वयन समर्थन करता है या नहीं isArray:

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

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

v instanceof Array

1225
2018-01-23 18:55



उदाहरण के लिए +1 ऐरे। सरल AFAICT - Tom Auger
v instanceof Array अगर झूठी वापसी होगी v एक और फ्रेम में बनाया गया था (v का उदाहरण है thatFrame.contentWindow.Array कक्षा)। - pepkin88
विस्तार से: Array.isArray ECMAScript 5 / जावास्क्रिप्ट 1.8.5 के हिस्से के रूप में परिभाषित किया गया है। - jevon
वास्तव में सरल और साफ समाधान लेकिन IsArray कुछ पुराने ब्राउज़रों (e.x. IE7 और IE8) के साथ संगत नहीं है। स्रोत: kangax.github.io/es5-compat-table/# - Wookie88
कैसे करें: अगर (Array.isArray) Array.isArray (v) वापस लौटें; अन्यथा वापसी उदाहरण उदाहरण के लिए; - lewdev


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>


283
2018-04-02 12:15



संदर्भ के रूप में: api.jquery.com/jQuery.isArray - Akseli Palén
बस एक नोट, jQuery आंतरिक रूप से toString विधि का उपयोग करता है: गिटहब स्रोत - Jacob Squires
@JacobSquires यह निर्भर करता है। मैंने अभी परीक्षण किया है, क्रोम पर नवीनतम jQuery - $.isArray === Array.isArray सच हो रहा है। - Renan
@ रेनान: यह jQuery का उपयोग करने के बारे में अच्छी बात है। यह आमतौर पर ऐसा करने के लिए सबसे आधुनिक और सर्वोत्तम विधि का उपयोग करता है, और आपको यह जानने के लिए स्वयं की सभी सुविधाओं को जांचने की ज़रूरत नहीं है कि क्या उपयोग करना है। - awe
लेकिन कोई भी इस कार्यक्षमता के लिए jQuery जस्ट का उपयोग करने जा रहा है, है ना? मैं सिर्फ jquery डाउनलोड नहीं करता क्योंकि मैं जांचना चाहता हूं कि कुछ सरणी है या नहीं: पी - Automagisch


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

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

84
2017-12-06 10:12



आप सही हैं, प्रश्न में शामिल परीक्षणों के मुताबिक यह सबसे तेज़ है। - mpen
क्या इस विधि का उपयोग करने के लिए कोई डाउनसाइड्स हैं? स्वीकार्य, शीर्ष उत्तर की तुलना में यह अधिक सरल और प्रभावी लगता है। - David Meza
@ शिनोबी - बस उत्सुक (और मैंने इसे अक्सर देखा है) - आप इस स्थिति को क्यों वाक्यांश देते हैं 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();} - unsynchronized
@shinobi सब अच्छा है। मुझे लगता है कि यह एक सुरक्षित सी आदत से एक हैंगओवर हो सकता है - यदि आप गलती से = इसके बजाय == का उपयोग करते हैं, तो यह संकलित नहीं होगा क्योंकि यह असाइन करने योग्य चर नहीं है। - unsynchronized


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

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

31
2017-12-10 17:01



आप अन्य उपयोगकर्ताओं के लिए समझना आसान बनाने के लिए कोड का स्पष्टीकरण जोड़ना चाहेंगे, लेकिन अन्यथा - अच्छा। +1 - Jeff
आपको प्राप्त करने की ज़रूरत है .toString() से विधि Object.prototype। अभी आप इसका उपयोग कर रहे हैं window.toString(), जो एक जैसा नहीं है। - the system
तुम सही हो। window.toString वैसे ही करो Object.prototype.toString बस क्रोम में - CruorVult
वाह (ऐरे में 'isArray')। इसे पहले कभी नहीं देखा। thks - Ivan Ferrer Villa
IsArray बिल्कुल तेज नहीं है। यह सबसे धीमी विधि है। - jemiloii


कल्पना करें कि आपके पास नीचे यह सरणी है:

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

जावास्क्रिप्ट (आईई 9 +, सी 5 +, एफएफ 4 +, सफ 5 +, ओपेरा 10.5 +)

Array.isArray(arr);

jQuery:

$.isArray(arr);

कोणीय:

angular.isArray(arr);

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

_.isArray(arr);

29
2017-12-27 13:17