如何通过其值获取JavaScript Map中的键?

Eng*_*ion 18 javascript dictionary

我有一个像这样的js Map

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');
Run Code Online (Sandbox Code Playgroud)

我想要的是一些通过其值返回键的方法

let jhonKey = people.getKey('jhon'); // jhonKey should be '1'
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 23

你可以在一系列条目中搜索它.

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

let jhonKeys = [...people.entries()]
        .filter(({ 1: v }) => v === 'jhon')
        .map(([k]) => k);

console.log(jhonKeys); // if empty, no key foudn otherwise all found keys.
Run Code Online (Sandbox Code Playgroud)

  • @NinaScholz 我很好奇,您是否真的在工作中使用这种单行代码,以及您是否正在以任何方式调试代码? (3认同)
  • 其实我们需要的是键而不是索引或值.. :) (2认同)
  • @NinaScholz如果您直接对地图值进行解构,则不需要数组访问和`||`逻辑:`[... people.values()]` (2认同)
  • @NinaScholz 很奇怪,我不知道这个技巧。[编辑] 什么是 `{ 1: v }` 语法?您正在将键值对解构为对象吗?为什么不使用“[k, v]”来代替 (2认同)

Raj*_*esh 17

您可以使用for..of循环直接遍历map.entries并获取密钥.

function getByValue(map, searchValue) {
  for (let [key, value] of map.entries()) {
    if (value === searchValue)
      return key;
  }
}

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

console.log(getByValue(people, 'jhon'))
console.log(getByValue(people, 'abdo'))
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案的一个优点可能是速度,因为没有阵列变换.要真正深入了解ES6的精神,如果将`var`更改为`const`可能会很好. (4认同)
  • 好一个,。只是一个提示 `const` 也适用于 `for of`。在这方面,它不像普通的“for”那样工作。 (2认同)
  • 只是我个人更喜欢使用“let”而不是“const”。 (2认同)
  • 您不需要“map.entries()”,地图本身充当迭代器。我提交了编辑。 (2认同)

Nit*_*ang 10

尽管已经存在迟到和其他很好的答案,但您仍然可以尝试以下“...”和“Array.find”:

let people = new Map();
people.set('1', 'jhon');
people.set('2', 'jasmein');
people.set('3', 'abdo');

function getKey(value) {
  return [...people].find(([key, val]) => val == value)[0]
}

console.log('Jasmein - ', getKey('jasmein'))

console.log('Jhon - ', getKey('jhon'))
Run Code Online (Sandbox Code Playgroud)


Dav*_*ett 7

没有直接的方法可以在这个方向上选择信息,所以如果您拥有的只是地图,则需要按照其他人的建议循环设置.

如果map/array/other足够大以至于这样的循环会出现性能问题并且在项目中需要反向查找,那么你可以使用一对map/arrays/other实现自己的结构.每个当前对象和另一个键和值反转.这样反向查找与普通查找一样有效.当然,您需要做更多的工作,因为您需要实现作为一个或两个底层对象的传递所需的每个方法,因此如果地图很小和/或不需要反向查找-via-loop选项可能更好,因为维护更简单,并且JiT编译器可能更容易优化.

在任何情况下,要注意的一件事是多个键可能具有相同值的可能性.如果这是可能的,那么在循环遍历地图时,你需要决定是否可以任意返回一个可能的键(可能是第一个),或者如果你想返回一个键数组,并且实现一个反向索引对于可能具有重复值的数据,也需要考虑相同的问题.


Lio*_*rom 6

JavaScript地图对象

鉴于 JavaScript 地图,我喜欢Nitish 的回答

const map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

function getKey(val) {
  return [...map].find(([key, value]) => val === value)[0];
}

console.log(getKey('one'));   // 1
console.log(getKey('two'));   // 2
console.log(getKey('three')); // 3
Run Code Online (Sandbox Code Playgroud)

对于 JavaScript 对象,您可以执行以下操作:

const map = {
  1: 'one',
  2: 'two',
  3: 'three',
};

function getKey(val) {
  return Object.keys(map).find(key => map[key] === val);
}

console.log(getKey('one'));   // 1
console.log(getKey('two'));   // 2
console.log(getKey('three')); // 3
Run Code Online (Sandbox Code Playgroud)

  • 很好,对于 Map 来说,为了在从未找到值匹配时不出错并仅返回 undefined,该函数可以是 `[...map].find(([key, value]) => val == =值)?.[0]` (3认同)