如果地图只有一个成员,如果您不知道密钥,如何在不循环的情况下获取它?

时间:2018-06-30 18:58:02

标签: javascript ecmascript-6

当地图只有一个成员并且您不知道键是否具有某种迭代地图的循环构造时,这是获取地图价值的唯一方法吗?

还是有某种速记myMap.item(0)之类的东西?

4 个答案:

答案 0 :(得分:2)

要获得预期结果,请在不使用键的情况下,使用以下选项ES6传播算子和[0] [1]的索引

var map = new Map()
map.set('contra', 'Asynchronous flow control')

console.log([...map][0][1])

代码示例-https://codepen.io/nagasai/pen/zaerbX

说明:

[... map] 将提供具有键值的数组数组,即 [['contra','异步流控制']]
[... map] [0] 将提供键值数组- ['contra','异步流控制']
[... map] [0] [0] 获取密钥,即'contra'
[... map] [0] [1] 无需使用键即可获得价值,即“异步流控制”

答案 1 :(得分:1)

Map中的条目按插入时间排序,并且也可以使用keys()values()entries()进行迭代,就像每个迭代一样。

  

还是存在myMap.item(0)之类的东西?

可以很容易地填充它:

Map.prototype.item = function(index) {
  let done, value;
  const iterator = this.values();
  do {
    ({done, value} = iterator.next());
  } while(!done && index-- > 0)
  return value;
};

或更简单:

Map.prototype.item = function(index) {
  return [...this][index];
};

答案 2 :(得分:0)

地图是可迭代的。根据{{​​3}},

  

Map对象按插入顺序迭代其元素

它应该被迭代以便到达特定的项目。因此[...myMap][0][1]实际上是这样做的,它会迭代整个映射并将其转换为数组,这不是很有效的方法。

一种更有效的方法可能是遍历地图键:

myMap.get([...myMap.keys()][0])

一种更有效的方法是不完全迭代地图,并在达到某个项目时停止迭代,例如与for..of

let item;
let i = 0;
for (const key of myMap.keys()) {
  if (i === 0) {
    item = myMap.get(key);
    break;
  }
  i++;
}

除非这种情况发生在性能至关重要的地方,否则可以将其视为初步优化。即使这样,考虑到这一要求,也可能存在更有效的数据存储方式,例如,使用Map子类,或者使用常规数组或Set-如果键无关紧要,而索引却需要,有可能选择了错误的实体作为键。

答案 3 :(得分:-1)

映射是键值对的字典。因此,要获取值,您需要使用get来通过键获取值。

var map1 = new Map();
map1.set('bar', 'foo');
map1.set('cat', 'dog');

console.log(map1.get('bar'))
console.log(map1.get('cat'))

如果您需要通过id获取值,则Map可能不是您数据的正确解决方案,在这种情况下,对象数组可能会更好。