【问题标题】:Is there a shorthand way to create a Map? [duplicate]有没有创建地图的速记方法? [复制]
【发布时间】:2017-09-04 20:48:01
【问题描述】:

以这段代码为例:

const db = new Map()
db.set('Neo4J', Neo4J.getDriver())
db.set('MongoDB', MongoDB.getDB())

有没有办法像某种地图文字一样缩短它?

【问题讨论】:

    标签: javascript dictionary ecmascript-6


    【解决方案1】:

    Map构造函数accepts an iterable

    一个数组或其他可迭代对象,其元素是键值对(具有两个元素的数组,例如 [[ 1, 'one' ],[ 2, 'two' ]])。每个键值对都被添加到新的 Map 中; null 值被视为未定义。

    可以通过Object.entries 使用对象字面量定义映射,该对象字面量返回由键值对组成的可迭代对象:

    new Map(Object.entries({
      Neo4J: Neo4J.getDriver(),
      MongoDB: MongoDB.getDB()
    }));
    

    Object.entries 是 ES2017,它在 ES5 和 ES6 中是 polyfillable。

    【讨论】:

    • 请注意,仅当您不关心订单时才使用Object.entries
    • 那个Bergi的本质是什么?是因为值可能会被删除并歪曲顺序,还是需要知道什么样的情况?
    • @agm1984 Bergi 指的是对象键在 JS 中在法律上是无序的,不能依赖它们的顺序。它们在现代实现中事实上是有序的,尤其是那些支持 ES6 和 Map 的实现。虽然从数组构造的地图将被可靠地排序。
    • 你们能否举一个例子来说明什么时候订购会受到影响?
    • @agm1984 当上面的代码在旧版浏览器中执行时,使用 polyfill Map 和 Object.entries,比如 IE9。例如,请参阅stackoverflow.com/questions/9942132/…
    【解决方案2】:

    我想我找到了答案。这似乎完美无缺:

    const db = new Map([
        ['Neo4J', Neo4J.getDriver()],
        ['MongoDB', MongoDB.getDB()]
    ])
    

    需要这个的原因是我的数据库连接驱动程序由于某些包含函数作为值的键而爆炸。

    地图可以很好地处理这个问题:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map

    【讨论】:

    • 嗯,这是文档中的第一行... “将...一个数组或其他元素为键值对的可迭代对象” 作为参数?
    • 眼光不错,急用时阅读文档是一项很好的技能。
    • 当然可以,而且我们大多数人都没有这种技能,我承认。现在你知道MapSet 都接受任何可迭代的,通常意味着任何有长度的东西,作为参数。不幸的是,这排除了大多数常规对象,它们更容易用作键->值对
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2022-01-24
    相关资源
    最近更新 更多