अभिव्यक्तिक्या कॉफ़ीस्क्रिप्ट में सरणी समानता का परीक्षण करने के लिए एक बेवकूफ तरीका है?
[1, 2, 3] == [1, 2, 3]
Coffeescript में false
का आकलन करती है लेकिन वहाँ एक संक्षिप्त, मुहावरेदार सरणी समानता परीक्षण करने के लिए तरीका है?
अभिव्यक्तिक्या कॉफ़ीस्क्रिप्ट में सरणी समानता का परीक्षण करने के लिए एक बेवकूफ तरीका है?
[1, 2, 3] == [1, 2, 3]
Coffeescript में false
का आकलन करती है लेकिन वहाँ एक संक्षिप्त, मुहावरेदार सरणी समानता परीक्षण करने के लिए तरीका है?
आप संख्याओं के एरे के साथ काम कर रहे हैं, और आप जानते हैं कि कोई nulls या अपने सरणियों में अपरिभाषित मूल्यों देखते हैं कि, तो आप उन्हें स्ट्रिंग के रूप में तुलना कर सकते हैं:
a = [1, 2, 3]
b = [1, 2, 3]
console.log "#{a}" is "#{b}" # true
console.log '' + a is '' + b # true
सूचना यह है कि
a = [1, 2, 3]
b = ['1,2', 3]
console.log "#{a}" is "#{b}" # true
आप एक और अधिक मजबूत समाधान चाहते हैं, तो आप उपयोग कर सकते हैं Array#every
: इस जैसे ही आप उस नंबर नहीं हैं अन्य बातों के की तुलना सरणियों शुरू टूट जाएगा
arrayEqual = (a, b) ->
a.length is b.length and a.every (elem, i) -> elem is b[i]
console.log arrayEqual [1, 2, 3], [1, 2, 3] # true
console.log arrayEqual [1, 2, 3], [1, 2, '3'] # false
console.log arrayEqual [1, 2, 3], ['1,2', 3] # false
ध्यान दें कि यह पहली बार सरणी की लंबाई की तुलना कर रहा है ताकि arrayEqual [1], [1, 2, 3]
सत्य न हो।
मुझे ऐरे :: हर समाधान पसंद है लेकिन आईआईआरसी कि विधि IE में समर्थित नहीं है <9 (हाँ, मेरी इच्छा है कि मुझे परवाह नहीं है, लेकिन ...) –
@PirateRob हाँ, यह एक समस्या हो सकती है। मैंने व्यक्तिगत रूप से टिप्पणी करना बंद कर दिया "सावधान रहें कि यह आईई में काम नहीं कर सकता" क्योंकि कई बार यह समझ में नहीं आता है; बहुत सारे मोबाइल जेएस विकास, नोड.जेएस और व्हाट्नॉट हैं, इसलिए, पिछली जानकारी के बिना मैं आईई संगतता पर भी टिप्पणी नहीं करता हूं। यदि आपको _do_ को IE के बारे में परवाह करने की आवश्यकता है, लेकिन फिर भी नई जेएस चीजों का उपयोग करना होगा, तो आप केवल आईई उपयोगकर्ताओं के अनुभव को कम कर सकते हैं और सशर्त रूप से "शिम" शामिल कर सकते हैं, जैसे [es5-shim] (https://github.com/kriskowal/es5-shim /), उन सभी उपहारों के लिए :) – epidemian
इसके अलावा, आप अंडरस्कोर के ['हर'] (http://underscorejs.org/#all) के कार्यान्वयन का उपयोग कर सकते हैं, जो क्रॉस-ब्राउज़र संगतता की गारंटी देगा बहुत कम लागत :) – epidemian
यदि आपको Underscore.js निर्भरता पेश करने में कोई बात नहीं है तो आप इसकी कुछ उपयोगिताओं का उपयोग कर सकते हैं। यह बड़े पैमाने पर सुंदर नहीं है, लेकिन मैं सादे coffeescript साथ यह करने के लिए एक आसान तरीका नहीं सोच सकते हैं:
a = [ 1, 2, 3 ]
b = [ 1, 2, 3 ]
equal = a.length == b.length and _.all(_.zip(a, b), ([x,y]) -> x is y)
केवल सुधार जो मुझे लगता है कि कॉफ़ीस्क्रिप्ट के विनाशकारी असाइनमेंट का उपयोग करना होगा: '_.all (x x, y] के लिए y.zip (a, b) में है)' – Trevor
सावधान रहें ['_.all'] (http://underscorejs.org/#all) _needs_ एक इटरेटर फ़ंक्शन। फ़ायरफ़ॉक्स और क्रोम दोनों में यह उदाहरण [ब्रेक] (http://jsfiddle.net/W5THS/) है क्योंकि यह अब है ("इटेटरेटर फ़ंक्शन नहीं है" एफएफ में फेंक दिया गया है)। सौभाग्य से, इसे ठीक करना आसान है (http://jsfiddle.net/W5THS/1/): '_.all _.zip (ए, बी), ([x, y]) -> x y है :) – epidemian
अनजाने में, '_.zip' का उपयोग करके इस समाधान को '[1, 2, 3, अपरिभाषित]' और '[1, 2, 3]' [बराबर] की तुलना करने का कारण होगा (http://jsfiddle.net/W5THS/2 /) :( – epidemian
मैं इस मुहावरेदार पर विचार नहीं होगा, लेकिन यह एक अतिरिक्त पुस्तकालय जोड़े बिना यह करने का एक तरीका हो सकता है :
a = [1, 2, 3, 4]
b = [22, 3, 4]
areEqual = true
maxIndex = Math.max(a.length, b.length)-1
for i in [0..maxIndex]
testEqual = a[i] is b[i]
areEqual = areEqual and testEqual
console.log areEqual
एक क्लीनर विधि के लिए JavaScript का reduce() फ़ंक्शन का उपयोग किया जाएगा। यह थोड़ा छोटा है लेकिन मुझे यकीन नहीं है कि सभी ब्राउज़रों का समर्थन कम हो जाता है।
a = [1, 3, 4, 5]
b = [1, 3, 4, 5]
maxIndex = Math.max(a.length, b.length)-1
areEqual = true
[0..maxIndex].reduce (p, c, i, ar) -> areEqual = areEqual and (a[i] is b[i])
console.log "areEqual=#{areEqual}"
मैं Sugar.js का बड़ा प्रशंसक हूं। आपको लगता है कि का उपयोग कर कर रहे हैं तो:
a = [1, 2, 3]
b = [1, 2, 3]
Object.equal(a, b)
निम्नलिखित अच्छा काम करता है और कोई निर्भरता की आवश्यकता है:
arrayEqual = (ar1, ar2) ->
JSON.stringify(ar1) is JSON.stringify(ar2)
यह वस्तुओं के लिए भी बहुत अच्छा काम करता है। –
यह फ़ंक्शन true
अगर सरणियों एक ही लंबाई है और एक ही सूचकांक के साथ सभी मूल्यों एक ही मूल्य है। अगर कोई तर्क एक सरणी नहीं है तो यह एक त्रुटि फेंकता है।
isArray = Array.isArray || (subject) ->
toString.call(subject) is '[object Array]'
compareArrays = (a, b) ->
unless isArray(a) and isArray b
throw new Error '`arraysAreEqual` called with non-array'
return false if a.length isnt b.length
for valueInA, index in a
return false if b[index] isnt valueInA
true
मुझे कॉफ़ीस्क्रिप्ट के बारे में बहुत कुछ पता नहीं है, लेकिन आप अलग-अलग सरणी मानों के बजाय '==' के साथ ऑब्जेक्ट की समानता का परीक्षण कर रहे हैं। –
किसी को यहां ध्यान देना चाहिए कि '==' को कॉपीराइट सूची में '=== 'को जावास्क्रिप्ट में निकाला जाता है। – SirLenz0rlot