如何在打字稿中的地图对象中以数字形式获取键?

时间:2018-07-26 21:40:05

标签: typescript

我正在使用对象作为打字稿中的地图:

const myMap: { [myKey: number]: string } = {};
myMap[42] = 'some string';

它工作正常...

console.log(myMap[42]); // => 'some string'

...直到我尝试获取地图中的键

for (let key of Object.keys(myMap)) {
  // key is a string, not a number
}

我猜这是因为Javascript实际上在内部将密钥存储为字符串,但是有没有办法将密钥存储为数字?

我想我可以使用Map,但是我对其表现有些警惕。而且,我会失去一些兼容性...

3 个答案:

答案 0 :(得分:0)

好吧,迭代对象的键正是for-in loop所做的。您只需要在其上使用parseInt

for (let key in myMap) {
    if(myMap.hasOwnProperty(key)) {
        console.log(parseInt(key)); // 42
        console.log(myMap[key]); // some string
    }
}

答案 1 :(得分:0)

  

实际上,Javascript通过以下方式将任何索引签名转换为字符串   隐式调用toString()。

您可以通过简单的调用进行检查:

console.log(myMap['42']); // => 'some string'

,它将仍然有效。所以从Object.keys()获得的任何键都是字符串。
如果您仍想将其用作数字,则可以执行以下操作:

for (let key of Object.keys(myMap)) {
  console.log(typeof +key,'would be a number')
  console.log(typeof key, 'would be a string')
}

答案 2 :(得分:0)

您可以使用数组,但是它将undefined放入每个未使用的索引中。这使迭代更具挑战性,并且意味着有可能在不丢失“ {map””的情况下有目的地添加undefined

const myMap = [];
myMap[42] = "some string";

// 42 commas, then "some string"
console.log(myMap.join(',')); 

// just "some string", but you lose the 42.
console.log(myMap.filter(e => typeof e !== "undefined").join(','));

// Something similar to Map.prototype.entries
for (let a of myMap.reduce((arr, cur, idx) => typeof cur !== "undefined" ? [...arr, [idx, cur]] : arr, [])) {
  console.log(a); // [ 42, "some string" ]
}

// Of course, a Map does this natively
const myTrueMap = new Map();
myTrueMap.set(42, "some string");

for (let e of myTrueMap.entries()) {
  console.log(e); // [ 42, "some string" ]
}

Map有一些polyfill(例如https://www.npmjs.com/package/es6-maphttps://github.com/paulmillr/es6-shim),但是YMMV。