javascript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)では、キー、長さ、サイズを設計通りに取得できません。ウィークマップを反復処理する方法は?
何らかの方法でエントリをループオーバーすることはできますか?
もしそうでなければ、どのようにしてChromeコンソールでこれを行いますか?
javascript WeakMap(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)では、キー、長さ、サイズを設計通りに取得できません。ウィークマップを反復処理する方法は?
何らかの方法でエントリをループオーバーすることはできますか?
もしそうでなければ、どのようにしてChromeコンソールでこれを行いますか?
何らかの方法でエントリを超えるにもかかわらずループすることが可能ですか?
いいえ、あなたの言うとおり、WeakMap
の内容は意図的にアクセスできず、繰り返し可能性はありません。
もしかしたら...私はどのようにしてこれを行うのですか?
コンソールではJSエンジンのデバッグAPIを使用してオブジェクトの内部(状態、ラップされたプリミティブなど)にアクセスすることができます。
私はこの答えを読んで以来、私はクロームコンソールにもっと奇妙な魔法を気づき始めました。まれに、コードをトレースしようとすると、コンソールから将来のデータも出力されることがあります。 – commonpike
@commonpike:その特定の動作については、こちら[http://stackoverflow.com/q/23392111/]を参照してください。 1048572)。 – Bergi
これは過去よりも未来からの価値のように見えますが、それ以上のものはありません。 :} – trusktr
ユニバーサル用のこの小さなスニペットをそれぞれに使用できます。しかし、ロダッシュを使用して大幅に強化することができます。
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;
}
事は:WeakMapsは反復可能ではないので、この解決法は適用されません。 myWeakMap.entries()。length == 0; WeakMapのアイテムのiterateeの呼び出しがありません。 –
'Array.from(新しいWeakMap()。set({}、{}))' ... no luck。 – Pacerier
いいえ、弱いマップは反復できません。コンソールは魔法を使っています(ちょっと、約束の値も同期して表示しています)。 – Bergi
OK - 私はその魔法をやりたい、何か提案したい? :-D – commonpike
デバッグインターフェイスを使用するアプリケーションを書く: – Bergi