2012-06-21 13 views
22

अभिव्यक्तिक्या कॉफ़ीस्क्रिप्ट में सरणी समानता का परीक्षण करने के लिए एक बेवकूफ तरीका है?

[1, 2, 3] == [1, 2, 3] 

Coffeescript में false का आकलन करती है लेकिन वहाँ एक संक्षिप्त, मुहावरेदार सरणी समानता परीक्षण करने के लिए तरीका है?

+0

मुझे कॉफ़ीस्क्रिप्ट के बारे में बहुत कुछ पता नहीं है, लेकिन आप अलग-अलग सरणी मानों के बजाय '==' के साथ ऑब्जेक्ट की समानता का परीक्षण कर रहे हैं। –

+5

किसी को यहां ध्यान देना चाहिए कि '==' को कॉपीराइट सूची में '=== 'को जावास्क्रिप्ट में निकाला जाता है। – SirLenz0rlot

उत्तर

14

आप संख्याओं के एरे के साथ काम कर रहे हैं, और आप जानते हैं कि कोई 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] सत्य न हो।

+2

मुझे ऐरे :: हर समाधान पसंद है लेकिन आईआईआरसी कि विधि IE में समर्थित नहीं है <9 (हाँ, मेरी इच्छा है कि मुझे परवाह नहीं है, लेकिन ...) –

+3

@PirateRob हाँ, यह एक समस्या हो सकती है। मैंने व्यक्तिगत रूप से टिप्पणी करना बंद कर दिया "सावधान रहें कि यह आईई में काम नहीं कर सकता" क्योंकि कई बार यह समझ में नहीं आता है; बहुत सारे मोबाइल जेएस विकास, नोड.जेएस और व्हाट्नॉट हैं, इसलिए, पिछली जानकारी के बिना मैं आईई संगतता पर भी टिप्पणी नहीं करता हूं। यदि आपको _do_ को IE के बारे में परवाह करने की आवश्यकता है, लेकिन फिर भी नई जेएस चीजों का उपयोग करना होगा, तो आप केवल आईई उपयोगकर्ताओं के अनुभव को कम कर सकते हैं और सशर्त रूप से "शिम" शामिल कर सकते हैं, जैसे [es5-shim] (https://github.com/kriskowal/es5-shim /), उन सभी उपहारों के लिए :) – epidemian

+0

इसके अलावा, आप अंडरस्कोर के ['हर'] (http://underscorejs.org/#all) के कार्यान्वयन का उपयोग कर सकते हैं, जो क्रॉस-ब्राउज़र संगतता की गारंटी देगा बहुत कम लागत :) – epidemian

6

यदि आपको 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) 
+3

केवल सुधार जो मुझे लगता है कि कॉफ़ीस्क्रिप्ट के विनाशकारी असाइनमेंट का उपयोग करना होगा: '_.all (x x, y] के लिए y.zip (a, b) में है)' – Trevor

+0

सावधान रहें ['_.all'] (http://underscorejs.org/#all) _needs_ एक इटरेटर फ़ंक्शन। फ़ायरफ़ॉक्स और क्रोम दोनों में यह उदाहरण [ब्रेक] (http://jsfiddle.net/W5THS/) है क्योंकि यह अब है ("इटेटरेटर फ़ंक्शन नहीं है" एफएफ में फेंक दिया गया है)। सौभाग्य से, इसे ठीक करना आसान है (http://jsfiddle.net/W5THS/1/): '_.all _.zip (ए, बी), ([x, y]) -> x y है :) – epidemian

+0

अनजाने में, '_.zip' का उपयोग करके इस समाधान को '[1, 2, 3, अपरिभाषित]' और '[1, 2, 3]' [बराबर] की तुलना करने का कारण होगा (http://jsfiddle.net/W5THS/2 /) :( – epidemian

3

मैं इस मुहावरेदार पर विचार नहीं होगा, लेकिन यह एक अतिरिक्त पुस्तकालय जोड़े बिना यह करने का एक तरीका हो सकता है :

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}" 
0

मैं Sugar.js का बड़ा प्रशंसक हूं। आपको लगता है कि का उपयोग कर कर रहे हैं तो:

a = [1, 2, 3] 
b = [1, 2, 3] 
Object.equal(a, b) 
3

निम्नलिखित अच्छा काम करता है और कोई निर्भरता की आवश्यकता है:

arrayEqual = (ar1, ar2) -> 
    JSON.stringify(ar1) is JSON.stringify(ar2) 
+0

यह वस्तुओं के लिए भी बहुत अच्छा काम करता है। –

0

यह फ़ंक्शन 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 
संबंधित मुद्दे

 संबंधित मुद्दे