Как перебрать weakmap?

слабая карта javascript ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ) не позволяет получить ключ, или длину или размер, по дизайну.

возможно ли тем не менее каким-то образом перебирать записи ?

Если не .. как консоль Chrome делает это ?

enter image description here

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;
}