आपका avatars
, किसी सरणी नहीं है यह सिर्फ एक वस्तु है:
avatars = {};
तो वहाँ है no defined order for its elements:
यांत्रिकी और गुण की गणना का क्रम (में कदम 6. a पहले एल्गोरिदम, दूसरे में चरण 7. ए) निर्दिष्ट नहीं है।
और 15.2.3.7 (और 15.2.3.14):
एक कार्यान्वयन के लिए गणन की एक विशेष क्रम को परिभाषित करता है, तो के लिए में बयान, कि एक ही गणना क्रम चरण 3 में सूची तत्वों ऑर्डर करने के लिए इस्तेमाल किया जाना चाहिए इस एल्गोरिदम का।
तुम भी section 8.6 पूछें कि ऐसी कोई वस्तु में गुणों का आदेश के बारे में कोई उल्लेख नहीं है को देखने के लिए कर सकते हैं। ऑब्जेक्ट गुणों को ऑर्डर करने की एकमात्र आवश्यकता यह है कि यदि कार्यान्वयन कहीं भी किसी ऑर्डर को परिभाषित करता है तो उसे हर जगह उसी ऑर्डरिंग का उपयोग करना होगा, लेकिन यदि है तो यह बड़ा है। अधिकतर कार्यान्वयन शायद किसी ऑब्जेक्ट की चाबियों के लिए सम्मिलन आदेश का उपयोग करते हैं, लेकिन मुझे ऐसा कुछ भी नहीं मिल रहा है जिसके लिए उन्हें आवश्यकता होती है (यदि कोई किसी ऑब्जेक्ट की चाबियों के किसी भी विशेष क्रम को परिभाषित करने वाले चश्मा में कुछ भी इंगित कर सकता है तो मैं एक टिप्पणी की सराहना करता हूं)।
कहा, अंडरस्कोर के sortBy
मूल रूप से एक Schwartzian Transform खोलने में Schwartzian ज्ञापन रैपर रूपांतरण एक मानक जावास्क्रिप्ट sort
और अंडरस्कोर के pluck
के साथ संयुक्त है, pluck
एक सरणी देता है इसलिए sortBy
भी एक सरणी देता है। इसलिए, आपका अंतिम _.keys(avatars)
कॉल वास्तव में एक सरणी पर _.keys
पर कॉल कर रहा है; एक सरणी की चाबियाँ (AKA संख्यात्मक गुण) सरणी के सूचकांक हैं और वे निरंतर पूर्णांक शून्य से शुरू होते हैं।
आप गलत डेटा संरचना का उपयोग कर रहे हैं। यदि आपको स्पैस सरणी की आवश्यकता है लेकिन इसे सरणी की तरह हेरफेर करने की आवश्यकता है (यानी।तरह यह), तो आप वस्तुओं के अंदर अनुक्रमित रख दिया और एक सामान्य सरणी का उपयोग करें और pluck
keys
के बजाय चाहिए:
var avatars = [
{idx: 102, userInfo: {buddy_name: 'Avatar102', is_online: 1}},
{idx: 100, userInfo: {buddy_name: 'Avatar100', is_online: 1}},
{idx: 101, userInfo: {buddy_name: 'Avatar101', is_online: 1}}
];
console.log(_(avatars).pluck('idx'));
avatars = _(avatars).sortBy(function(avatar) {
return avatar.userInfo.buddy_name.toLowerCase();
});
console.log(_(avatars).pluck('idx'));
डेमो: http://jsfiddle.net/ambiguous/UCWL2/
आप भी idx
द्वारा त्वरित पहुँच की जरूरत है तो आप सेट कर सकते हैं
var avatars_by_idx = { };
for(var i = 0; i < avatars.length; ++i)
avatars_by_idx[avatars[i].idx] = avatars[i];
फिर avatars_by_idx
सीधी पहुँच आप देख रहे हैं प्रदान करता है: प्रत्यक्ष idx
पहुँच के लिए एक समानांतर वस्तु अप। बेशक, आपको avatars
और avatars_by_idx
सिंक्रनाइज़ करना होगा, लेकिन यदि आप किसी ऑब्जेक्ट के पीछे उन्हें छुपाते हैं तो यह बहुत मुश्किल नहीं है।
अवतार एक शब्दकोश है और इसकी प्रकृति से अनुरक्षित है। तो, आपको वास्तव में क्या चाहिए? क्रम में अवतारों को फिर से चलाने की क्षमता? विस्तृत प्रतिक्रिया के लिए –
http://jsfiddle.net/zL9GD/2/ –