Как чисто работать с типом карты в JavaScript - PullRequest
0 голосов
/ 25 января 2019

По сути, я только начал изучать карту es6 из-за ее уникальных свойств, и меня немного беспокоят чистые операции.

Например, я часто удаляю свойства из объектов, с которыми я работаю:

function cloneOmit( obj, props ) {
  const keys = !Array.isArray(props)
    ? Object.keys(obj).filter(k => k !== props)
    : Object.keys(obj).filter(k => !props.includes(k));

  return keys.reduce(
    (clone, key) => {
      return { ...clone, [key]: obj[key] };
    },
    {}
  );
}

Я переписал это для работы с Картами:

function cloneOmitMap( map, keys ) {
  const oldKeys = Array.from(map.keys());
  const newKeys = !Array.isArray(keys)
    ? oldKeys.filter(k => k !== keys)
    : oldKeys.filter(k => !keys.includes(k));

  return newKeys.reduce((newMap, key) => {
    return newMap.set(key, map.get(key));
  }, new Map());
}

Это нормально, но я не уверен, что это эффективно или даже лучше.Меня привлекают Карты из-за их итерационных возможностей (Object.keys() громоздко и уродливо постоянно вызывать), их приверженности вставке заказов и особенно их допустимости любого значения в качестве ключа, но они не кажутся такими же благоприятными для чистых операций, какОбычные объекты:

Например, если я хочу добавить свойство к объекту чисто:

const object = { foo: 'bar' }
const newObject= { ...object, fooFoo: 'barBar' }

Мне интересно, есть ли какие-то операции с картами, которые я не настороженноэто может помочь облегчить работу с ними чисто, или, возможно, даже небольшую служебную библиотеку.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 25 января 2019

Я бы рекомендовал использовать Map s в их интерфейсах итераторов. Конечно, создание большого количества временных неизменяемых Map не будет быстрее, чем использование их изменчиво, но итераторы должны быть быстрее, чем делать все с преобразованиями массивов.

Используя эти вспомогательные функции , ваш код может выглядеть как

function cloneOmit(map, keys) {
  const predicate = Array.isArray(keys)
    ? Set.prototype.has.bind(new Set(keys))
    : k => k === keys

  return new Map(filter(map.entries(), ([key, value]) => !predicate(key)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...