2010-07-05 13 views
9

मेरे पास एक ऐसा पृष्ठ है जहां मैं कई divs के लिए कक्षाओं के सरणी लाने की कोशिश कर रहा हूं जो आम साझा करते हैं कक्षा। उदाहरण के लिए:

<div class="common lorem ipsum"></div> 
<div class="common dolor sit"></div> 
<div class="common hello world"></div> 

मैं हर common वर्ग div लाने और यह के वर्गों में से किसी सरणी प्राप्त करना चाहते हैं। पल में, मैं यह jQuery के इस बिट का उपयोग करके कर रहा हूँ:

$('.common').each(function(index) { 
    var classes = $(this).attr('class').split(" "); 
    for(var i in classes) { 
    alert(classes[i]); 
    } 
}); 

पहले जिसके परिणामस्वरूप classes चर को देखते हुए इस देता है:

classes: Array (3) 
0: "common" 
1: "lorem" 
2: "ipsum" 
length: 3 
__proto__: Array 

समस्या यह है कि बार-बार दोहराना for(var i in classes) हो रहा है है __proto__ पर ऐरे और उसमें भी नीचे उतरना - क्या कोई भी इससे पहले कभी आया है? मैं क्रोम का नवीनतम संस्करण (6.0.453.1) का उपयोग कर रहा हूं।

उत्तर

16
for (var i = 0, l = classes.length; i<l; ++i) { 
alert(classes[i]); 
} 

पाश के लिए एक नियमित के साथ एक सरणी के माध्यम से दोहराएं, नहीं एक for...in अन्यथा यह सरणी के गुणों के माध्यम से (अपने अभी भी एक वस्तु के बाद से और तत्वों के अंदर के अलावा अन्य गुण है) विश्लेषण करता है।

+2

+1 बचने gotchas :) http://stackoverflow.com/questions/3154215/what-are-the-most-common-causes-of-errors-in-javascript-and -how-to-fix-them/3154285 # 3154285 – galambalazs

+0

यह भी ध्यान दें कि for..in को संख्यात्मक क्रम में सूचकांक तक पहुंचने की गारंटी नहीं है (देखें [एमडीसी] (https://developer.mozilla.org/en/Core_JavaScript_1। 5_ संदर्भ/विवरण/के लिए ... में) –

+0

सच है, सौभाग्य से यह कोई समस्या नहीं है – galambalazs

2

@meder अपने प्रश्न सिर्फ सही जवाब मैं सिर्फ, जोड़ने के लिए है कि अगर गणन के आदेश महत्वपूर्ण नहीं है, तो आप हमेशा इस सरल फार्म का उपयोग कर सकते हैं चाहता था:

for (var i = classes.length; i--;) { 
    alert(classes[i]); 
} 

यह कम है और तेज़

+1

या यदि आप और भी तेज़ी से चाहते हैं, तो लूप का नकारात्मक उपयोग करें। – Anders

+0

जो कोड की एक और पंक्ति है, लगभग ** कोई लाभ नहीं **। असली मुद्दा यहां ** पठनीयता ** है। यह फॉर्म हर क्षेत्र पर अच्छा करता है। – galambalazs

4

अन्य वैध उत्तर देने के लिए जोड़ने के लिए, के बाद से आप पहले से ही jQuery का उपयोग कर रहे हैं, तो आप jQuery.each का लाभ ले सकते:

$.each(classes, function (i, cls) { 
    alert(cls); 
}); 
0

मैं इस प्रयोग किया जाता here देखा है।

मुझे यकीन नहीं है कि (i in this)0-n के खिलाफ डबल-चेक क्या है।

var thisp = arguments[1]; 
for (var i = 0, len = this.length; i < len; i++){ 
    if (i in this){ 
    fun.call(thisp, this[i], i, this); // fun(element,index,array) 
    } 
} 
+1

'मैं इस चेक में' चेक इसलिए है क्योंकि [जावास्क्रिप्ट सरणी स्पैस हैं] (http://stackoverflow.com/questions/1510778/are-javascript-arrays-sparse)। यह जरूरी नहीं है कि 0 से 'लंबाई' के प्रत्येक पूर्णांक वास्तव में सरणी का तत्व है। –

1

मेडर के जवाब देने के लिए जा रहे हैं ...

वहाँ सुरक्षित रूप से एक वस्तु का विरासत में मिला गुण से नाराज जा रहा है बिना वस्तुओं से अधिक पुनरावृत्ति का एक तरीका है। बचाव के लिए hasOwnProperty():

for(var i in classes) { 
    if (classes.hasOwnProperty(i)) { 
    var safeValue = classes[i]; 
    } 
} 
संबंधित मुद्दे