当使用Map而不是普通数组更可取时,我很难找到一个真实的情况。只是看起来每次都很难使用。
你有没有尝试一个合适的案例?
谢谢。
发布于 2019-08-20 05:41:58
当你想创建一个将键映射到值的数据结构时使用map,这对我很有用,比如在自然语言处理期间,我们有不同的命令必须绑定到关键字,然后可以通过这些关键字直接访问这些关键字-而数组只是一个包含和索引其内容的容器。如果要访问数组的内容,则需要指定索引或运行条件比较来查找查询
发布于 2019-08-20 05:52:16
V8引擎堆不太擅长管理对象数组。如果您有一个包含100,000个对象的数组,循环每个对象并删除中间的一个参数,然后重新添加它,堆大小将达到峰值,而不是保持不变。
// Spike the memory heap
arr.forEach(obj => {let temp = obj[0]; delete obj[0]; obj[0] = temp})堆将达到峰值的原因是因为在对数组执行forEach循环期间,V8会创建中间数组。一旦你循环的数组变得巨大(例如:100,000个元素)内存尖峰将太大而无法处理,并可能使程序崩溃。
像Map和Set这样的迭代变量不是由引擎以这种方式处理的,您可以使用像iter-tools这样的库来为它们获取类似数组的转换方法。
发布于 2019-08-20 08:15:39
作为covered briefly by MDN,Map有许多技术优势-虽然简单的Array或Object可能足以满足简单的数据结构,但通常情况下,现代web开发的日益复杂证明使用其他东西是合理的。
让我们看几个具体的例子:
Map 的密钥可以是
在现代图书馆和webapps中,memoization经常被用来降低重复性操作的性能成本。简而言之,记忆化是存储第一次运行后给定输入的给定函数的输出的行为。
地图是存储这些数据的一个很好的候选者,因为您可以使用它们,而不管您想通过什么来建立索引。
const cache = new Map();
const input = [2, 3, 2]; // Assuming this is immutable for simplicity
function expensive(n, ...args) {
if (!args.length) return n;
return Math.pow(n, expensive(...args));
}
function memoExpensive(arr) {
const memoResult = cache.get(arr);
if (memoResult) {
console.log('used memo', memoResult);
return memoResult;
}
const result = expensive(...arr);
console.log('calculated', result);
cache.set(arr, result);
return result;
}
memoExpensive(input);
memoExpensive(input);
在某些情况下,您还可以使用Symbol和常规Object,但Map在这方面更通用。
按顺序排序密钥
对于常规的Object,密钥是部分排序的(从ECMAScript 2015开始,在此之前,在不同的引擎上有点不确定)。键只对string和Symbol键保持其顺序,而对数字键进行排序。
例如,向order c, b, a, 3, 2, 1中的Object添加密钥时,存储的订单将为1, 2, 3, c, b, a。
const obj = {};
obj.c = 1;
obj.b = 2;
obj.a = 3;
obj[3] = 4;
obj[2] = 5;
obj[1] = 6;
console.log(Object.keys(obj));
Map将保持插入关键点的顺序,而不考虑它们的类型。
const map = new Map();
map.set('c', 1);
map.set('b', 2);
map.set('a', 3);
map.set(3, 4);
map.set(2, 5);
map.set(1, 6);
console.log(Array.from(map.keys()));
通常这并不重要,特别是在随意的web开发中,但当键的顺序很重要时,有许多notorious cases。
Map 是可迭代的
虽然在问题中提到的Array也是可迭代的,但是Map提供了比Object更好的键值映射用例。可迭代有a number of benefits,即时执行和保证顺序是两个例子。
const map = new Map()
map.set(document.body, 'blue')
map.set(document.documentElement, 'green')
for (let pair of map) {
console.log(pair);
}
其他好处
你可能会选择Map而不是其他选择,比如performance as covered by Asthmatic,avoiding Object prototype issues,convenience等,还有很多其他的好处。
希望这篇一般性概述已经涵盖了您遇到的大多数问题。
https://stackoverflow.com/questions/57563144
复制相似问题