如何在 JavaScript 中纯粹使用 Map 数据类型



标题 基本上,我刚刚开始探索 es6 Map,因为它具有独特的属性,我有点担心纯操作。

例如,经常从我使用它的对象中删除属性:

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

这很好,但我不确定它是否是性能,甚至是最好的方法。我被 Maps 所吸引,因为它们的迭代功能(Object.keys()不断调用既麻烦又丑陋),它们对顺序插入的坚持,尤其是它们允许任何值作为键,但它们似乎不像普通对象那样有利于纯操作。

例如,如果我想纯粹地向对象添加属性:

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

我想知道是否有一些我不警惕的 Map 操作可能有助于纯粹地使用它们,或者甚至可能是一个小型实用程序库。任何帮助不胜感激!

我建议通过他们的迭代器接口使用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)));
}

最新更新