【问题标题】:Is it possible to check if a JS Map contains a value and have it return its key是否可以检查 JS Map 是否包含一个值并让它返回它的键
【发布时间】:2020-12-18 02:15:38
【问题描述】:

我正在尝试寻找一种方法来查看 Map 数组值,以查看它是否存在,如果它确实将 Map 键作为变量返回。这让我有点难过,因为我不怎么做 javascript。

const map = new Map([
        ["KEY1", ["dummy1","dummy2","dummy3"]],
        ["KEY2", ["dummy4","dummy5","dummy6","dummy7"]],
        ["KEY3", ["dummy8","dummy9"]],
    ]);

所以说我有 dummy4 作为 var 我想在 map 中查看并在 key2 的值​​数组中看到它,并将键返回到一个新变量 sting "KEY2"

【问题讨论】:

  • KEY2 不包含值key2
  • 如果您对此进行大量查找并且需要快速查找,请考虑“反转”结构。制作表格value => key.
  • 你能解释一下你为什么这样做吗?这完全违背了地图的使用方式。
  • 正是@tadman 所说的。如果这是一次性的或出于调试目的,它可能没问题,但如果这是您希望使用地图的正常方式,或者如果操作出现在循环中,您应该重新考虑结构。
  • 我这样做是为了搜索一个可能有很多术语的特定值,它可能不是最好的方法,我想出的基本上可以将许多值输入到输入中,但所有只涉及一个输出

标签: javascript arrays dictionary


【解决方案1】:

我这样做是为了搜索一个可能有很多术语的特定值,它可能不是最好的方法,我想出的基本上很多值都可以输入到输入中,但都与只有一个输出

根据评论,我将推荐一种不同的方式来构建您的查找结构 -

const terms =
  [ ["KEY1", ["dummy1","dummy2","dummy3"]]
  , ["KEY2", ["dummy4","dummy5","dummy6","dummy7"]]
  , ["KEY3", ["dummy8","dummy9"]]
  ]
  
const dict =
  new Map(terms.flatMap(([ k, vs ]) => vs.map(v => [ v, k ])))
  
console.log(dict.get("dummy2"))
console.log(dict.get("dummy5"))
console.log(dict.get("dummy7"))
console.log(dict.get("dummy9"))
console.log(dict.get("dummy0"))

输出 -

KEY1
KEY2
KEY2
KEY3
undefined

这更有效,因为 Map 结构提供对任何值的即时查找,并且不需要完整的.entries 扫描 -

Map
  { "dummy1" -> "KEY1"
  , "dummy2" -> "KEY1"
  , "dummy3" -> "KEY1"
  , "dummy4" -> "KEY2"
  , "dummy5" -> "KEY2"
  , "dummy6" -> "KEY2"
  , "dummy7" -> "KEY2"
  , "dummy8" -> "KEY3"
  , "dummy9" -> "KEY3"
  }

【讨论】:

    【解决方案2】:

    循环通过entries

    function findValue(map, value) {
        for (const [k, arr] of map.entries()) {
            if (arr.includes(value)) {
                return k;
            }
        }
    }
    

    【讨论】:

    • 这符合OP的要求,但效率低,使用地图不自然
    猜你喜欢
    • 2015-06-28
    • 1970-01-01
    • 2011-04-20
    • 2014-09-04
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多