ES6 Map键是字符串或数字

时间:2017-11-14 12:11:59

标签: javascript ecmascript-6

我有一个ES6地图,其中键是数字。有时键是数字,有时键是表示数字的字符串。对于我来说,地图在运行时永远不会有重复键。示例我永远不会有关键" 1"和1。

从地图中检索时,我需要一个简单的单行代码,它将否定密钥是字符串还是数字。

var map = new Map();
undefined
map.set('1', 'string one');
map.set(2, 'number tow')
Map(2) {"1" => "string one", 2 => "number tow"}
map.get(1)
undefined
map.get('1')
"string one"

3 个答案:

答案 0 :(得分:4)

您可以只使用没有原型的对象。对于访问,密钥将转换为字符串。



var map = Object.create(null);

map['1'] = 'string one';
map[2] = 'number two';

console.log(map[1]);   // 'string one'
console.log(map['1']); // 'string one'
console.log(map);




答案 1 :(得分:1)

我创建了一个从给定地图中获取值的函数。它有两种方式,从字符串到int,从int到字符串。

var map = new Map();
map.set('1', 'string one');
map.set(2, 'number two');

function getFromMap(map, key){
  return map.get(key) || map.get(key.toString()) || map.get(parseInt(key));
}

console.log(getFromMap(map, 1));
console.log(getFromMap(map, '2'));

答案 2 :(得分:1)

对于初学者,我建议您清理密钥(例如只使用字符串或仅使用数字),这样可以让您的生活更轻松。

如果你仍然坚持使用这两种键,你可以创建一个这样的包装函数:

function getFromMap(map, key){
    var stringKey = key.toString(); 
    var integerKey = parseInt(key);
    return map.get(stringKey) || map.get(integerKey);
} 

作为旁注: 在您的情况下,您似乎可以轻松使用普通对象(使用括号进行对象分配会自动将数字转换为字符串):

var o = {};
o[1] = 'First value';
console.log(o[1] === o['1']); // true

有关使用Map vs Objects的优点/缺点的更多信息,请您阅读以下SA question