如何从Map返回默认值?

时间:2016-04-29 20:45:24

标签: javascript

使用ES6代理对象,当普通对象中不存在属性时,可以返回默认值。

binary_search

如何使用地图执行此操作?我尝试了以下代码,但始终返回默认值:

{{1}}

2 个答案:

答案 0 :(得分:9)

那是因为您的地图密钥是数字,但代理属性名称始终是字符串。您需要先将id转换为数字。

工作示例(需要现代JS引擎):



var map = new Map ([
    [1,  'foo'],  // default
    [2,  'bar'],
    [3,  'baz'],
]);

var mapProxy = new Proxy(map, {
    get: function(target, id) {
        // Cast id to number:
        id = +id;
        return target.has(id) ? target.get(id) : target.get(1);
    },
});

console.log( mapProxy[3] ); // baz
console.log( mapProxy[10] ); // foo




答案 1 :(得分:1)

在Scala中,地图是具有getOrElse方法的monad。如果monad(容器)不包含任何值,则其get方法会因异常而失败,但getOrElse允许用户编写可靠的代码

Map.prototype.getOrElse = function(key, value) {
  return this.has(key) ? this.get(key) : value
}

var map = new Map ([[1,  'foo'],  [2,  'bar'], [3,  'baz']]); 
[map.get(1), map.getOrElse(10, 11)]; // gives 11

另一种选择是扩展您的地图withDefaultValue方法

//a copy of map will have a default value in its get method
Map.prototype.withDefaultValue = function(defaultValue) {
  const result = new Map([...this.entries()]); 
  const getWas = result.get; result.get = (key) => 
    result.has(key) ? getWas.call(this, key) : defaultValue; 
  return result
}
map.withDefaultValue(12).get(10) // gives 12

这是在Scala中完成的方式。或者,至少看起来那样。