javascript - जावास्क्रिप्ट में एक चर एक सरणी है या नहीं, तो आप कैसे जांचते हैं?




arrays variables (16)

इस प्रश्न का उत्तर यहां दिया गया है:

मैं यह जांचना चाहता हूं कि एक चर या तो जावास्क्रिप्ट में सरणी या एकल मान है या नहीं।

मुझे एक संभावित समाधान मिला है ...

if (variable.constructor == Array)...

क्या यह सबसे अच्छा तरीका यह किया जा सकता है?


अपने सभी quirks के साथ कई समाधान हैं। यह पृष्ठ एक अच्छा अवलोकन देता है। एक संभावित समाधान है:

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

आधुनिक ब्राउज़रों (और कुछ विरासत ब्राउज़र) में, आप कर सकते हैं

Array.isArray(obj)

(क्रोम 5, फ़ायरफ़ॉक्स 4.0, आईई 9, ओपेरा 10.5 और सफारी https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray 5)

यदि आपको IE के पुराने संस्करणों का समर्थन करने की आवश्यकता है, तो आप es5-shim का उपयोग polyfill Array.isArray में कर सकते हैं; या निम्नलिखित जोड़ें

# 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

नोट : arguments कीवर्ड जो किसी फ़ंक्शन के तर्क तक पहुंचने के लिए उपयोग किया जा सकता है वह एक ऐरे नहीं है, भले ही यह (आमतौर पर) एक जैसा व्यवहार करता हो:

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

कुछ मैं बस के साथ आया था:

if (item.length) //This is an array else //not an array



क्रॉकफोर्ड की जावास्क्रिप्ट में गुड पार्ट्स में , यह जांचने के लिए एक फ़ंक्शन है कि दिया गया तर्क एक सरणी है या नहीं:

var is_array = function (value) {
    return value &&
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
};

वो समझाता है:

सबसे पहले, हम पूछते हैं कि क्या मूल्य सत्य है या नहीं। हम इसे शून्य और अन्य झूठे मूल्यों को अस्वीकार करने के लिए करते हैं। दूसरा, हम पूछते हैं कि टाइपफ मान 'ऑब्जेक्ट' है या नहीं। यह वस्तुओं, सरणी, और (अजीब तरह से) शून्य के लिए सच होगा। तीसरा, हम पूछते हैं कि क्या मूल्य की एक लंबी संपत्ति है जो एक संख्या है। यह हमेशा सरणी के लिए सच होगा, लेकिन आमतौर पर वस्तुओं के लिए नहीं। चौथा, हम पूछते हैं कि मूल्य में एक स्प्लिस विधि है या नहीं। यह फिर से सभी सरणी के लिए सच होगा। आखिरकार, हम पूछते हैं कि क्या लम्बाई संपत्ति गिनती है (लंबाई लूप के लिए लम्बाई होगी?)। यह सभी सरणी के लिए झूठा होगा। यह पाया गया है कि सरणी के लिए यह सबसे विश्वसनीय परीक्षण है। यह दुर्भाग्यपूर्ण है कि यह बहुत जटिल है।


चूंकि। लम्बाई संपत्ति जावास्क्रिप्ट में सरणी के लिए विशेष है, इसलिए आप बस कह सकते हैं

obj.length === +obj.length // true if obj is an array

अंडरस्कोर और कई अन्य पुस्तकालय इस छोटी और सरल चाल का उपयोग करते हैं।


मुझे ब्रायन का जवाब पसंद आया:

function is_array(o){
    // make sure an array has a class attribute of [object Array]
    var check_class = Object.prototype.toString.call([]);
    if(check_class === '[object Array]')    {
        // test passed, now check
        return Object.prototype.toString.call(o) === '[object Array]';
    } else{
        // may want to change return value to something more desirable
        return -1; 
    }
}

लेकिन आप बस ऐसा ही कर सकते हैं:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

मुझे लगता है कि myObj.constructor == ऑब्जेक्ट और myArray.constructor == ऐरे का सबसे अच्छा तरीका है। ToString () का उपयोग करने से लगभग 20x तेज है। यदि आप अपने स्वयं के रचनाकारों के साथ वस्तुओं का विस्तार करते हैं और चाहते हैं कि उन रचनाओं को "वस्तुओं" के रूप में भी माना जाए, तो यह काम नहीं करता है, लेकिन अन्यथा इसका तरीका तेज़ है। टाइपोफ कन्स्ट्रक्टर विधि के जितना तेज़ है लेकिन टाइप करें [] == 'ऑब्जेक्ट' सत्य लौटाता है जो अक्सर अवांछित होगा। http://jsperf.com/constructor-vs-tostring

ध्यान देने योग्य एक बात यह है कि null.constructor एक त्रुटि फेंक देगा ताकि यदि आप शून्य मानों की जांच कर रहे हों तो आपको पहले करना होगा (testThing! == null) {}


मैं कोड की इस पंक्ति का उपयोग कर रहा था:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}

मैंने इस छोटे कोड को बनाया है, जो सही प्रकार लौटा सकता है।

मैं अभी तक प्रदर्शन के बारे में निश्चित नहीं हूं, लेकिन यह टाइपफ़ोफ़ को सही तरीके से पहचानने का प्रयास है।

https://github.com/valtido/better-typeOf ने इसके बारे में यहां कुछ ब्लॉग किया है http://www.jqui.net/jquery/better-typeof-than-the-javascript-native-typeof/

यह वर्तमान प्रकार के समान काम करता है।

var user = [1,2,3]
typeOf(user); //[object Array]

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


यदि आप केवल एक्मास्क्रिप्ट 5 और उससे ऊपर के साथ काम कर रहे हैं तो आप अंतर्निहित Array.isArray फ़ंक्शन का उपयोग कर सकते हैं

जैसे,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false

यदि आप कोणीय का उपयोग कर रहे हैं, तो आप angular.isArray () फ़ंक्शन का उपयोग कर सकते हैं

var myArray = [];
angular.isArray(myArray); // returns true

var myObj = {};
angular.isArray(myObj); //returns false

http://docs.angularjs.org/api/ng/function/angular.isArray


यह जांचने के कई तरीके हैं कि एक चर एक सरणी है या नहीं। सबसे अच्छा समाधान वह है जिसे आपने चुना है।

variable.constructor === Array

यह क्रोम पर सबसे तेज़ तरीका है, और अधिकतर अन्य सभी ब्राउज़रों की संभावना है। सभी सरणी ऑब्जेक्ट्स हैं, इसलिए कंस्ट्रक्टर प्रॉपर्टी की जांच करना जावास्क्रिप्ट इंजन के लिए एक तेज प्रक्रिया है।

यदि आपको पता लगाने में कोई समस्या है कि कोई ऑब्जेक्ट प्रॉपर्टी एक सरणी है, तो आपको पहले यह जांचना होगा कि संपत्ति वहां है या नहीं।

variable.prop && variable.prop.constructor === Array

कुछ अन्य तरीके हैं:

variable instanceof Array

यह विधि पहले उदाहरण के रूप में गति 1/3 गति को चलाती है। अभी भी बहुत ठोस, क्लीनर दिखता है, अगर आप सब सुंदर कोड के बारे में हैं और प्रदर्शन पर इतना ज्यादा नहीं हैं। ध्यान दें कि संख्याओं की जांच करना variable instanceof Number रूप में काम नहीं करता है, variable instanceof Number हमेशा falseअद्यतन: instanceof अब 2/3 गति चला जाता है!

Array.isArray(variable)

यह आखिरी है, मेरी राय में सबसे उग्र है, और यह सबसे धीमी है। पहले उदाहरण के रूप में गति 1/5 गति चल रहा है। Array.prototype, वास्तव में एक सरणी है। आप यहां इसके बारे में और अधिक पढ़ सकते हैं https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

तो अभी तक एक और अद्यतन

Object.prototype.toString.call(variable) === '[object Array]';

यह आदमी एक ऐरे की जांच करने की कोशिश करने के लिए सबसे धीमा है। हालांकि, यह किसी भी प्रकार की स्टॉप शॉप है जिसे आप ढूंढ रहे हैं। हालांकि, चूंकि आप एक सरणी की तलाश में हैं, बस उपरोक्त सबसे तेज़ विधि का उपयोग करें।

इसके अलावा, मैंने कुछ परीक्षण चलाया: http://jsperf.com/instanceof-array-vs-array-isarray/33 तो कुछ मज़ा लें और इसे देखें।

नोट: @EscapeNetscape ने एक और परीक्षण बनाया है क्योंकि jsperf.com नीचे है। http://jsben.ch/#/QgYAV मैं यह सुनिश्चित करना चाहता था कि मूल लिंक जब भी jsperf ऑनलाइन वापस आ जाए, तब तक मूल लिंक रहें।


सार्वभौमिक समाधान नीचे है:

Object.prototype.toString.call(obj)=='[object Array]'

ईसीएमएस्क्रिप्ट 5 से शुरू, एक औपचारिक समाधान है:

Array.isArray(arr)

साथ ही, पुराने जावास्क्रिप्ट libs के लिए, आप नीचे समाधान पा सकते हैं हालांकि यह पर्याप्त सटीक नहीं है:

var is_array = function (value) {
    return value &&
    typeof value === 'object' &&
    typeof value.length === 'number' &&
    typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

समाधान http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript


Crockford माध्यम से:

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (value instanceof Array) {
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

मुख्य विफल क्रॉकफोर्ड उल्लेख एक अलग संदर्भ में बनाए गए सरणी को सही तरीके से निर्धारित करने में असमर्थता है, उदाहरण के लिए, window । यदि यह अपर्याप्त है तो उस पृष्ठ में एक अधिक परिष्कृत संस्करण है।


w3schools :

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







variables