2015-09-04 8 views
8

एक जावास्क्रिप्ट WeakMap (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) आपको डिज़ाइन द्वारा कुंजी, या लंबाई या आकार प्राप्त करने की अनुमति नहीं देता है।एक कमजोर पड़ने पर कैसे पुनरावृत्ति करें?

क्या किसी भी तरह से प्रविष्टियों पर लूप करना संभव है?

यदि नहीं .. क्रोम कंसोल यह कैसे करता है?

enter image description here

+0

नहीं है, कमजोर नक्शे iterable नहीं हैं। कंसोल जादू करता है (हे, यह सिंक्रोनस के साथ-साथ वादे के मूल्य भी दिखाता है)। – Bergi

+0

ठीक है - मैं वह जादू करना चाहता हूं, कोई सुझाव? :- डी – commonpike

+0

डीबग इंटरफ़ेस का उपयोग करने वाले एप्लिकेशन को लिखें :-) – Bergi

उत्तर

10

फिर भी किसी तरह से प्रविष्टियों से अधिक लूप करना संभव है?

नहीं, जैसा कि आप कहते हैं, WeakMap की सामग्री डिज़ाइन द्वारा उपलब्ध नहीं है, और कोई पुनरावृत्ति नहीं है।

यदि नहीं ... क्रोम कंसोल यह कैसे करता है?

सांत्वना जे एस इंजन की डिबगिंग एपीआई, जो वस्तुओं के आंतरिक भागों (यह भी राज्यों, लिपटे पुरातन, आदि वादा करने के लिए) और कई और अधिक करने के लिए उपयोग की अनुमति देता का उपयोग करता है।

+1

जब से मैंने यह जवाब पढ़ा, मैंने क्रोम कंसोल में और अजीब जादू को देखना शुरू कर दिया। ऐसी दुर्लभ स्थितियां हैं जहां कंसोल, कोड का पता लगाने की कोशिश करते समय, भविष्य से डेटा आउटपुट भी कर सकता है :-) – commonpike

+0

@commonpike: यह विशेष व्यवहार समझाया गया है [यहां] (http://stackoverflow.com/q/23392111/ 1,048,572)। – Bergi

+0

वे अतीत के सापेक्ष भविष्य के मूल्यों की तरह दिखते हैं लेकिन वर्तमान से आगे नहीं। :} – trusktr

0

आप इस छोटे स्निपेट का उपयोग सार्वभौमिक के लिए प्रत्येक के लिए कर सकते हैं। हालांकि यह lodash का उपयोग करता है और इसे काफी बढ़ाया जा सकता है।

import lodashForEach from 'lodash/forEach'; 
import entries from 'lodash/entries'; 
/** 
* @since [email protected] 
* @param {Array|Map|Object|Set|WeakMap|WeakSet} iterable 
* @param {Function} iteratee 
* @example 
* const iterable = new Map(); 
* iterable.set('somekey1', 1); 
* iterable.set('somekey2', 2); 
* // or 
* const iterable = new Set(); 
* iterable.add("entry1"); 
* iterable.add("entry2"); 
* // run function 
* forEach(iterable, (value, key) => { 
* console.group('-'); 
* console.info('KEY'); 
* console.log(key); 
* console.info('VALUE'); 
* console.log(value); 
* console.groupEnd(); 
* }); 
*/ 
function forEach(iterable, iteratee) { 
    lodashForEach((iterable instanceof Set || iterable instanceof WeakSet) ? Array.from(iterable) : entries(iterable), (entry, index, collection) => { 
     iteratee(entry[1], entry[0], collection, index); 
    }); 
    return iterable; 
} 

export default forEach; 

अद्यतन

के बाद लंबे समय से पारित कर दिया है कि मैं इस सवाल का जवाब गलत पाया। यह बात कोर-जेएस पॉलीफिल लाइब्रेरी में बग तय की गई है जहां यह देशी वीकैप कार्यान्वयन को अपने आप के साथ कार्यान्वित करता है। तो मेरा समाधान आधुनिक ब्राउज़रों में मान्य नहीं है।

function forEach(iterable, iteratee) { 
    switch (true) { 
     case Array.isArray(iterable) || iterable instanceof Map: 
      iterable.forEach(iteratee); 
      break; 
     case iterable instanceof Set: 
      Array.from(iterable).forEach(iteratee); 
      break; 
     case iterable instanceof WeakMap || iterable instanceof WeakSet: 
      // some kind of warning 
      break; 
     default: 
      Object.keys(iterable).forEach((key) => iteratee.call(null, iterable[key], key)); 
      break; 
    } 
    return iterable; 
} 
+1

बात यह है कि: WeakMaps पुनरावर्तनीय नहीं हैं, इसलिए यह समाधान लागू नहीं होता है। myWeakMap.entries() लंबाई == 0; तो वीकैप में वस्तुओं के लिए, इटेटेट की कोई कॉलिंग नहीं। –

+0

'Array.from (नया WeakMap()। सेट ({}, {})) '... कोई भाग्य नहीं। – Pacerier

संबंधित मुद्दे