सारांश: JSON.stringify
से हैश ऑब्जेक्ट्स का कोई तेज़ तरीका है?ऑब्जेक्ट तर्कों का कुशल ज्ञापन
विवरण: मेरे पास रूबी और जावास्क्रिप्ट लाइब्रेरी (NeatJSON) है जो जावास्क्रिप्ट मानों की सुंदर-प्रिंटिंग प्रदान करती है। मैंने हाल ही में एक समस्या तय की है जहां गहराई से घिरे हुए ऑब्जेक्ट्स ओ (एन!) प्रदर्शन (एन घोंसला स्तर होने के कारण) धारावाहिक और इंडेंटेशन राशि के आधार पर ज्ञापन का उपयोग करके ज्ञापन का उपयोग कर रहा है।
रूबी, the fix में, वास्तव में आसान था, क्योंकि आप कर सकते हैं वस्तुओं की अद्वितीय सेट की सरणियों द्वारा सूचकांक हैश:
build = ->(object,indent) do
memoizer[[object,indent]] ||= <all the rest of the code>
end
जावास्क्रिप्ट में, हालांकि, मैं सूचकांक किसी अन्य वस्तु से एक वस्तु नहीं कर सकते हैं (में एक अनोखा तरीका)। कई लेख मैं ऑनलाइन पाया के नेतृत्व के बाद, मैं fix the problem सामान्य रूप से करना चाहते हैं, कार्य करने के लिए तर्क का पूरा सेट पर JSON.stringify
का उपयोग कर Memoization के लिए एक अद्वितीय कुंजी बनाने के लिए:
function memoize(f){
var memo = {};
var slice = Array.prototype.slice;
return function(){
var args = slice.call(arguments);
var mkey = JSON.stringify(args);
if (!(mkey in memo)) memo[mkey] = f.apply(this,args);
return memo[mkey];
}
}
function rawBuild(o,indent){ .. }
var build = memoize(rawBuild);
यह काम करता है, लेकिन (क) यह है मैं चाहता हूं कि थोड़ा धीमा, और (बी) यह हर वस्तु और मूल्य के निष्पादन (निष्पक्ष) क्रमबद्ध करने के लिए जंगली रूप से अक्षम (और सुरुचिपूर्ण) लगता है कि मैं समझदारी से क्रमबद्ध करने जा रहा हूं। कई मूल्यों के साथ एक बड़ी वस्तु को क्रमबद्ध करने का कार्य पूरे ऑब्जेक्ट में प्रत्येक अद्वितीय मूल्य (केवल पत्ती मानों) के लिए एक स्ट्रिंग और स्वरूपण परिणाम संग्रहीत करने जा रहा है।
क्या कोई आधुनिक जावास्क्रिप्ट चाल है जो मुझे विशिष्ट रूप से मूल्य की पहचान करने देगी? उदाहरण के लिए, किसी आंतरिक आईडी तक पहुंचने का कोई तरीका, या अन्यथा अनन्य पूर्णांक वाले जटिल ऑब्जेक्ट्स को जोड़ना जो मान के लिए पहचानकर्ता ढूंढने के लिए ओ (1) समय लेता है?
बहुत [जावास्क्रिप्ट ऑब्जेक्ट आईडी] की (नहीं काफी dup) के समान (http://stackoverflow.com/q/2020670/405017)। काफी डुप्लिकेट नहीं है क्योंकि मुझे केवल ऑब्जेक्ट्स नहीं, अधिकांश प्रकार के मूल्य (स्ट्रिंग, बुलियन, संख्या, सरणी, ऑब्जेक्ट) के लिए एक अद्वितीय प्रतिनिधित्व खोजने की आवश्यकता है। – Phrogz
क्या आप ऑब्जेक्ट वैल्यू या रेफरेंस द्वारा याद रखना चाहते हैं? दूसरे शब्दों में: 'var a = {b: 1}; var c = memoizedFn (ए); एबी = 2; var d = memoizedFn (ए); 'क्या दूसरी कॉल ज्ञापन मान का उपयोग करनी चाहिए? –
@TamasHegedus संदर्भ से पूरी तरह से पर्याप्त है। – Phrogz