在JavaScript Map对象中,如何获取特定索引处的键?

22
假设我有以下的地图对象。
const items = new Map([['item1','A'], ['item2','B'], ['item3', 'C']])

我想获取索引为2的键。除了使用for循环以外,还有其他方法可以获取索引为2的项的键吗?

根据答案,我已经让它工作了。

Array.from(items.keys())[2]

如何在不迭代的情况下获取ES6 Map的最后一个元素? - Bergi
1
为什么不使用数组来实现这个目的? - Nina Scholz
Array.from(items.keys())[2][...items.keys()][2] 是相同的,它们都会分配完整的键数组。如果您想避免这种情况,请参见 https://dev59.com/Y4vda4cB1Zd3GeqPVy7a - le_m
4个回答

36

要获取索引为2的键,请执行以下操作:

// Your map
var items = new Map([['item1','A'], ['item2','B'], ['item3', 'C']]);

// The key at index 2
var key = Array.from(items.keys())[2];                 // Returns 'item3'

// The value of the item at index 2
var val1 = items.get(key);                             // Returns 'C'


// ... or ...
var val2 = items.get(Array.from(items.keys())[2]);     // Returns 'C'

2
更简洁但效率较低的方法是,如果映射很小,只需获取所有值:var val2 = Array.from(items.values())[2]; - GGizmos

25

地图可以被排序,但它们没有索引。获取第n项的唯一方法是循环。


2
真遗憾...这里有任何TC39的人想要谈谈为什么它们没有被索引吗? - geoyws
@geoyws 因为这不是它们的目的?如果你想要一个索引集合,使用数组。 - Bergi
9
我正在寻找一种解决方案,允许我拥有一个键和值都有序并且可以索引的集合... 数组无法同时满足键和值有序以及在查找特定“键”时需要循环的需求。对象没有顺序,会混乱无序。映射表没有索引,需要循环才能获得索引。这很遗憾,因为我本以为映射表可以解决我的问题。 - geoyws
1
@geoyws,您可以在两个地图+一个数组的基础上构建所需内容。一个地图用于存储键值对,另一个地图用于存储键索引映射,一个数组用于存储索引键映射。确保每个操作(按键设置、按键删除、按键查找、按索引查找)都能正确作用于这三种结构,具体取决于有关信息来自哪一个结构。 这不需要语言支持。 - Bakkot
1
@geoyws ES6 可能会指定一些操作的顺序(但例如不包括循环),以保持引擎之间的行为一致,但这并不意味着对象应该被用作有序集合。 - Bergi
显示剩余5条评论

5

const a = new Map([['1 Item', 'abc'], ['2 Item', 'def']]);
let indexVal =   [...a][1];
console.log(indexVal);


2

这里有一个更全面的解决方案,它不会毫无意义地将所有值复制到一个数组中:

function get_nth_key<K, V>(m: Map<K, V>, n: number): K | undefined {
  if (n < 0) {
    return undefined;
  }
  const it = m.keys();
  for (;;) {
    const res = it.next();
    if (res.done) {
      return undefined;
    }
    if (n <= 0) {
      return res.value;
    }
    --n;
  }
}

const m = new Map<string, string>([['item1', 'A'], ['item2', 'B'], ['item3', 'C']]);

console.log(get_nth_key(m, -1));
console.log(get_nth_key(m, 0));
console.log(get_nth_key(m, 1));
console.log(get_nth_key(m, 2));
console.log(get_nth_key(m, 3));

输出:

undefined
item1
item2
item3
undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接