【问题标题】:ES6 Map key to be either string or numberES6 映射键为字符串或数字
【发布时间】:2018-04-27 09:20:20
【问题描述】:

我有一个 ES6 Map ,其中键是数字。有时键是数字,有时键是代表数字的字符串。对我来说,地图在运行时永远不会有重复的键。示例我永远不会有键 "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"

【问题讨论】:

  • 请添加问题。
  • 你最好重新考虑你的方法,坚持使用数字或字符串。
  • 为什么不使用对象?所有键都转换为字符串。
  • 我同意@NinaScholz 的观点,如果你永远不会同时拥有1'1',那么使用Map 毫无意义...

标签: javascript ecmascript-6


【解决方案1】:

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

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);

【讨论】:

    【解决方案2】:

    我创建了一个从给定映射中获取值的函数。它适用于两种方式,从 string 到 int 以及从 int 到 string。

    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'));

    【讨论】:

    • 这给地图的每次搜索增加了很多复杂性,并且可能会大大降低脚本速度,因为您(在最坏的情况下)搜索地图 3 次以找到单个值...
    • 正确,Nina Scholz 的回答是比这更好的解决方案。
    【解决方案3】:

    对于初学者,我建议您对密钥进行消毒(例如,仅使用字符串或仅使用数字),这样您的生活会更轻松。

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多