2015-09-04 19 views
8

javascript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)では、キー、長さ、サイズを設計通りに取得できません。ウィークマップを反復処理する方法は?

何らかの方法でエントリをループオーバーすることはできますか?

もしそうでなければ、どのようにしてChromeコンソールでこれを行いますか?

enter image description here

+0

いいえ、弱いマップは反復できません。コンソールは魔法を使っています(ちょっと、約束の値も同期して表示しています)。 – Bergi

+0

OK - 私はその魔法をやりたい、何か提案したい? :-D – commonpike

+0

デバッグインターフェイスを使用するアプリケーションを書く: – Bergi

答えて

10

何らかの方法でエントリを超えるにもかかわらずループすることが可能ですか?

いいえ、あなたの言うとおり、WeakMapの内容は意図的にアクセスできず、繰り返し可能性はありません。

もしかしたら...私はどのようにしてこれを行うのですか?

コンソールではJSエンジンのデバッグAPIを使用してオブジェクトの内部(状態、ラップされたプリミティブなど)にアクセスすることができます。

+1

私はこの答えを読んで以来、私はクロームコンソールにもっと奇妙な魔法を気づき始めました。まれに、コードをトレースしようとすると、コンソールから将来のデータも出力されることがあります。 – commonpike

+0

@commonpike:その特定の動作については、こちら[http://stackoverflow.com/q/23392111/]を参照してください。 1048572)。 – Bergi

+0

これは過去よりも未来からの価値のように見えますが、それ以上のものはありません。 :} – trusktr

0

ユニバーサル用のこの小さなスニペットをそれぞれに使用できます。しかし、ロダッシュを使用して大幅に強化することができます。

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; 

UPDATE

長い時間が、私はこの答えが間違ってい渡された後。事はコア-jsの古いバージョンです。polyfillライブラリは、ネイティブのWeakMapを独自のものに置き換えたバグが修正されています。だから私の解決策は現代のブラウザでは有効ではありません。

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()。length == 0; WeakMapのアイテムのiterateeの呼び出しがありません。 –

+0

'Array.from(新しいWeakMap()。set({}、{}))' ... no luck。 – Pacerier

関連する問題