答案 0 :(得分:9)
那是因为您的地图密钥是数字,但代理属性名称始终是字符串。您需要先将id
转换为数字。
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中完成的方式。或者,至少看起来那样。