我正在使用对象作为打字稿中的地图:
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
,但是我对其表现有些警惕。而且,我会失去一些兼容性...
答案 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-map,https://github.com/paulmillr/es6-shim),但是YMMV。