डी 3जे में forEach
और क्या अंतर है each
?
जवाबों:
पहला, .forEach()
डी 3 का हिस्सा नहीं है, यह जावास्क्रिप्ट सरणियों का एक मूल कार्य है। इसलिए,
["a", "b", "c"].forEach(function(d, i) { console.log(d + " " + i); });
// Outputs:
a 0
b 1
c 2
और वह काम करता है भले ही पृष्ठ पर डी 3 लोड न हो।
अगला, d3 के .each()
d3 चयनों पर काम करता है (जब आप प्राप्त करते हैं d3.selectAll(...)
)। तकनीकी रूप से, आप .forEach()
एक डी 3 चयन पर कॉल कर सकते हैं , चूंकि पर्दे के पीछे, डी 3 चयन अतिरिक्त कार्यों (उनमें से एक .each()
) के साथ एक सरणी है । लेकिन आपको ऐसा नहीं करना चाहिए क्योंकि:
ऐसा करने से वांछित व्यवहार नहीं होगा। यह जानना कि .forEach()
किसी भी वांछित व्यवहार का निर्माण करने के लिए d3 चयन के साथ उपयोग कैसे करना है, d3 के आंतरिक कामकाज की अंतरंग समझ की आवश्यकता होगी। तो ऐसा क्यों है, अगर आप सिर्फ एपीआई के दस्तावेज, सार्वजनिक हिस्से का उपयोग कर सकते हैं।
जब आप फोन .each(function(d, i) { })
एक d3 चयन पर, तुम बस की तुलना में अधिक मिलता है d
और i
: समारोह में इस तरह लागू हो जाता है कि this
के साथ जुड़े एचटीएमएल DOM एलीमेंट का कि समारोह अंक के अंदर कीवर्ड कहीं भी d
। console.log(this)
अंदर से दूसरे शब्दों में function(d,i) {}
कुछ की तरह लॉग करेगा <div class="foo"></div>
या जो भी HTML तत्व है। और यह उपयोगी है, क्योंकि तब आप इस this
ऑब्जेक्ट पर फ़ंक्शन को कॉल कर सकते हैं ताकि इसके सीएसएस गुण, सामग्री या जो भी बदल सकें। आमतौर पर, आप इन गुणों को सेट करने के लिए d3 का उपयोग करते हैं, जैसे कि d3.select(this).style('color', '#c33');
।
मुख्य टेकअवे कि उपयोग कर रहा है, .each()
: आप 3 बातों तक पहुँच प्राप्त की जरूरत है d
, this
और i
। साथ .forEach()
, (तरह शुरू से ही उदाहरण में) एक सरणी पर आप केवल 2 बातें मिल ( d
और i
), और आप के लिए काम का एक समूह ऐसा करने के लिए उन लोगों को भी 2 चीजों के साथ एक HTML तत्व सहयोगी होगा। और वह, अन्य बातों के अलावा, डी 3 कैसे उपयोगी है।
this
कई d3 परिदृश्यों में एक चिंता का विषय है जहाँ आप उच्च क्रम वाले कार्यों में गुजरते हैं, उदाहरण के लिए selection.style("color", function(d,i) { /* here 'this' is a DOM element */ })
। मेरा मानना है कि आंशिक रूप से क्यों d3 कक्षाएं ( d3.svg.axis
उदाहरण के लिए) prototype
वर्गों को परिभाषित करने के तरीकों का उपयोग नहीं करती हैं - पर निर्भरता से बचने के तरीके के रूप में this
। लेकिन मैं यह नहीं देखता कि selection[0].forEach(...)
इस मुद्दे से कैसे बचा जाए। क्या यह वही समस्या नहीं है?
.forEach
लिए एक 2 पैरा स्वीकार किया गया था this
। इसने मुझे एहसास दिलाया कि आप .each()
जावास्क्रिप्ट के .bind()
तरीके का उपयोग करके d3 के साथ समान प्रभाव प्राप्त करने के लिए कुछ समान-ईश का उपयोग कर सकते हैं । उदाहरण के लिए, निम्नलिखित इच्छा दायरे this
को window
और यह console.log जाएगा: selection.each(function() { console.log(this); }.bind(window))
।