जावास्क्रिप्ट: पता लगाएँ कि क्या तर्क वस्तु के बजाय सरणी है (Node.JS)


87

मुझे कैसे पता लगाना चाहिए कि तर्क एक सरणी है क्योंकि typeof []रिटर्न 'object'और मैं सरणियों और वस्तुओं के बीच अंतर करना चाहते हैं।

यह संभव है कि वस्तु दिखेगी, {"0":"string","1":"string","length":"2"}लेकिन मैं नहीं चाहता कि यह एक सरणी के रूप में सामने आए अगर यह वास्तव में एक वस्तु है जो एक सरणी की तरह दिख रही है।

JSON.parseऔर JSON.stringifyयह भेद करने में सक्षम हैं। मैं यह कैसे कर सकता हूं?

मैं Node.JS का उपयोग कर रहा हूं जो V8 क्रोम पर आधारित है।

जवाबों:


164
  • Array.isArray

देशी V8 फ़ंक्शन। यह तेज है, यह हमेशा सही है। यह ES5 का हिस्सा है।

  • arr instanceof Array

जाँचता है कि क्या ऑब्जेक्ट सरणी कंस्ट्रक्टर के साथ बनाया गया था।

अंडरस्कोर से एक विधि। यहाँ एक स्निपेट उनके स्रोत से लिया गया है

var toString = Object.prototype.toString,
    nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
    return toString.call(obj) === '[object Array]';
};

यह विधि एक ऑब्जेक्ट लेती है और उस Object.prototype.toStringपर विधि को कॉल करती है। यह हमेशा [object Array]सरणियों के लिए लौटेगा ।

अपने व्यक्तिगत अनुभव में, मुझे लगता है कि toStringविधि पूछना सबसे प्रभावी है, लेकिन यह उतना छोटा या पठनीय नहीं है instanceof Arrayऔर ना ही यह उतना तेज़ है Array.isArrayलेकिन यह ES5 कोड है और मैं इसे पोर्टेबिलिटी के लिए उपयोग करने से बचता हूं।

मैं व्यक्तिगत रूप से आपको उपयोग करने की कोशिश करने की सिफारिश करूंगा underscore, जो कि एक पुस्तकालय है जिसमें सामान्य उपयोगिता विधियां हैं। इसमें बहुत सारे उपयोगी कार्य हैं जो आपके कोड को DRY करते हैं।


1
उपयोग Node.js utilपुस्तकालय - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
Kof

5
कोमल अनुस्मारक, हमें ('उपयोग') की आवश्यकता नहीं है। नोड में v4.00 और इसके बाद के संस्करण .Aray (गिरफ्तार)। यह पदावनत है
सुनील खियाटानी

किसी तरह, नोड 10.x में ऐसा लगता है कि arr instanceof Arrayविफल रहता है। हालांकि Array.isArray()काम करता है महान।
एलेक्सिस विलके


8

कैसा रहेगा:

your_object instanceof Array

क्रोम में V8 में मुझे मिलता है

[] instanceof Array
> true
({}) instanceof Array
> false 
({"0":"string","1":"string","length":"2"}) instanceof Array
> false

7

मुझे लगता है कि इस प्रश्न के कई अच्छे उत्तर हैं, लेकिन पूर्णता के लिए मैं एक और विकल्प जोड़ूंगा, जो पहले नहीं सुझाया गया है।

यह जाँचने के लिए कि क्या कोई सरणी है, आप Node.js utilदेशी मॉड्यूल और इसके isArray()फ़ंक्शन का उपयोग कर सकते हैं ।

उदाहरण:

var util = require('util');

util.isArray([]);  // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false

उस पद्धति के साथ आपको V8 द्वारा कार्यान्वित JS मानकों के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि यह हमेशा सही उत्तर दिखाएगा।


5
FWIW, util.isArray()वर्तमान में सम्‍मिलित है Array.isArray(): github.com/joyent/node/blob/…
टॉम स्पेन्सर

0

इस तरह से प्रयास करें:
कंसोल.लॉग (Object.prototype.toString.call (arg) .replace (/ [[ऑब्जेक्ट (+ +)] $ /, '$ 1')। toLowerCase ()।

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