实习地图
现场实例见https://observatorablehq.com/@mbostock/internmap.
如果您在 JavaScript 映射中将日期作为密钥( 或作为 Set 中的值) , 您可能会惊讶它不会像你预期的那样工作 .
dateMap = new Map([
[new Date(Date.UTC(2001, 0, 1)), "red"],
[new Date(Date.UTC(2001, 0, 1)), "green"] // distinct key!
])
dateMap.get(new Date(Date.UTC(2001, 0, 1))) // undefined!
因为地图使用 相同的ValueZero算法 确定关键平等:要将两个日期视为相同日期,它们必须是同一个实例(同一个目标),而不是仅仅同一个时间。 平等经营者也是如此.
{
const date1 = new Date(Date.UTC(2001, 0, 1));
const date2 = new Date(Date.UTC(2001, 0, 1));
return date1 === date2; // false!
}
可以通过使用数字或字符串等原始值取而代之来避免这个问题. 不过, (在从地图上取出密钥时 地图钥匙或 地图进入,或者在地图上徘徊的时候 上面的倒数是新的日期( N)键) (中文(简体) ). 另外,如果你忘记在使用时将钥匙按到数字 地图因为地图不会出错; 它只会返回未定义的地图
numberMap = new Map([[978307200000, "red"]])
numberMap.get(978307200000) // "red"
numberMap.get(new Date(978307200000)) // undefined; oops!
如果地图与设定“只是工作”日期, 或者任何支持对象 对象价值? 吗?
输入 实习地图。 。 。 . 实习 指只存储每个不同密钥的一个副本。 InternMap认为代表同一时刻的两个Date例是等同的,只存储初审.
map = new InternMap([
[new Date(Date.UTC(2001, 0, 1)), "red"],
[new Date(Date.UTC(2001, 0, 1)), "green"] // replaces previous entry
])
map.get(new Date(Date.UTC(2001, 0, 1))) // "green"
[...map.keys()] // [2001-01-01]
InternMap 扩展了地图, 所以只要你喜欢这样的行为, 就可以直接放进去。 因为实习医生打电话来 对象仅对非原始密钥的值,注意您也可以通过原始密钥.
map.get(978307200000) // "green"; this works too!
InternMap根据其相關原始价值只保留了第一个显著的密钥. 避免在地图上添加不一致类型的密钥.
map2 = new InternMap([
[978307200000, "red"], // danger!
[new Date(Date.UTC(2001, 0, 1)), "blue"]
])
map2.get(new Date(Date.UTC(2001, 0, 1))) // "blue"; this still works…
[...map2.keys()] // [978307200000]; but the key isn’t a Date
当 InternMap 使用时 对象.valueOf 默认计算 intern 密钥,您可以将一个密钥函数作为第二个参数传递给构建者以改变行为. 例如,如果使用JSON.stringify,可以使用数组作为复合键(假设数组元素可以被序列化为JSON).
map3 = new InternMap([
[["foo", "bar"], 1],
[["foo", "baz"], 2],
[["goo", "bee"], 3]
], JSON.stringify)
map3.get(["foo", "baz"]) // 2
有个 实习班 课,太.
set = new InternSet([
new Date(Date.UTC(2000, 0, 1)),
new Date(Date.UTC(2001, 0, 1)),
new Date(Date.UTC(2001, 0, 1))
])