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

时间:2019-01-25 18:21:04

标签: javascript functional-programming

基本上,由于它的独特属性,我才刚刚开始探索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操作可能有助于简化使用它们的工作,甚至可能只是一个小的实用程序库。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

我建议在其迭代器界面上使用Map。当然,创建许多临时的不可变Map不会比可变地使用它们快,但是迭代器仍然比数组转换要快。

使用these helper functions,您的代码应类似于

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