2012-07-15 9 views
9

में परेशान करता है जब मैं चयन.sort() के साथ d3 में पथों का चयन पुन: व्यवस्थित करता हूं, डेटा-जॉइन परेशान होता है और मेरे पथ गलत डेटा ऑब्जेक्ट्स को पुनः सौंपे जाते हैं।d3.js में चयन को सॉर्ट करने से डेटा को

मैं केवल पथों को फिर से व्यवस्थित करना चाहता हूं ताकि कुछ दूसरों के शीर्ष पर (जैसे जेड-इंडेक्स में) समाप्त हो जाएं। मैं डेटा ऑब्जेक्ट को एक पथ से दूसरे रास्ते में पुन: असाइन नहीं करना चाहता हूं।

मैं डेटा-शामिल होने में परेशान किए बिना पथ को कैसे पुन: व्यवस्थित कर सकता हूं?

_friends.selectAll('path').sort(function(a, b){ 
    return d3.ascending(a.Q, b.Q); 
}); 

उत्तर

11

ऐसा लगता है कि आपको key function निर्दिष्ट करने की आवश्यकता है। यह आपको डिफ़ॉल्ट पर भरोसा करने के बजाय, मनमानी कुंजी द्वारा डेटा को बाध्य करने की अनुमति देता है, जो सरणी में डेटाम की स्थिति का उपयोग करना है यानी ऑर्डर (जो आपके मामले में बदल सकता है)।

आप पहले से ही प्रत्येक गृहीत के लिए एक अनूठा कुंजी नहीं है, तो आप हमेशा सिर्फ उन्हें लोड करते समय उत्पन्न कर सकते हैं:

var id = 0; 
for (var i = 0; i < data.length; i++) data[i].id = id++; 

आप कोई नया डेटा बनाते हैं तो आपके id बढ़ाने के लिए एक पाने के लिए जारी रख सकते हैं नया, अद्वितीय आईडी।

फिर, बाध्यकारी आप कर सकते हैं डेटा के लिए:

.data(data, function(d) { return d.id; }) 
+0

धन्यवाद, जेसन, एक महत्वपूर्ण समारोह चाल किया था। – Mark

+3

[ऑब्जेक्ट कॉन्स्टेंसी पर ट्यूटोरियल] (http://bost.ocks.org/mike/constancy/) भी देखें, जो महत्वपूर्ण कार्यों पर चर्चा करता है। – mbostock