Как перебрать weakmap?
слабая карта javascript ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ) не позволяет получить ключ, или длину или размер, по дизайну.
возможно ли тем не менее каким-то образом перебирать записи ?
Если не .. как консоль Chrome делает это ?
2 ответов
возможно ли тем не менее каким-то образом перебирать записи?
нет, как вы говорите, содержимое a WeakMap
недоступны по дизайну, и нет итерабельности.
Если нет ... как это делает консоль Chrome?
консоль использует API отладки JS engine,который позволяет получить доступ к внутренним объектам (также обещать состояния, завернутые примитивы и т. д.) и многое другое.
Вы можете использовать этот небольшой фрагмент для универсальная forEach. Однако он использует лодашь и может быть значительно улучшена.
import lodashForEach from 'lodash/forEach';
import entries from 'lodash/entries';
/**
* @since lodash@4.17.3
* @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;
обновление
после долгого времени я нашел этот ответ неправильный. Дело в более старой версии core-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;
}