Javascript 在什么情况下,您会选择使用贴图而不是普通数组?
我很难找到一个真实的情况,因为最好使用地图而不是普通数组。似乎每次都很难使用 你试验过合适的案例吗Javascript 在什么情况下,您会选择使用贴图而不是普通数组?,javascript,ecmascript-6,Javascript,Ecmascript 6,我很难找到一个真实的情况,因为最好使用地图而不是普通数组。似乎每次都很难使用 你试验过合适的案例吗 谢谢。以汽车经销商为例。 如果您想要一个所有客户的列表,您应该使用一个普通数组,因为您只需要一个元素列表 var myArray=['Walter','Jesse','Saul'] 但是,假设您希望存储客户所在的州以及他们的姓名,那么您希望使用地图,以便数据之间存在相关性(否则您只需要随机列出姓名和州) var myMap=newmap(['Walter','Arizona',['Jesse','
谢谢。以汽车经销商为例。 如果您想要一个所有客户的列表,您应该使用一个普通数组,因为您只需要一个元素列表
var myArray=['Walter','Jesse','Saul']代码>
但是,假设您希望存储客户所在的州以及他们的姓名,那么您希望使用地图,以便数据之间存在相关性(否则您只需要随机列出姓名和州)
var myMap=newmap(['Walter','Arizona',['Jesse','Florida',['Saul','ohoio'])代码>
请原谅我的地理位置,但我不是美国人P
编辑:添加了正确的映射
声明。当您想要创建将键映射到值的数据结构时,使用映射,这对我很有用,即在自然语言处理期间,我们有不同的命令必须绑定到关键字,然后可以通过这些关键字直接访问,而数组只是一个容器,它的内容包含和索引。
如果要访问数组的内容,则需要指定索引或运行条件比较以查找查询V8引擎堆不太擅长管理对象数组。
如果有100000个对象的数组,则循环遍历每个对象并在中间删除一个参数,然后重新添加它,堆大小将尖峰而不是保持不变。
// Spike the memory heap
arr.forEach(obj => {let temp = obj[0]; delete obj[0]; obj[0] = temp})
堆将尖峰的原因是V8在数组上的forEach循环期间创建了中间数组。一旦正在循环的阵列变得庞大(例如100000个元素),内存峰值将过大,无法处理,并可能导致程序崩溃
引擎不会以这种方式处理Map和Set等易位,您可以使用类似于库的方法为它们获取类似数组的转换方法。As,Map
具有许多技术优势,而一个简单的array
或Object
就可以满足简单数据结构的需要,通常,现代web开发的复杂性越来越高,需要使用其他东西
让我们看几个具体的例子:
地图的键可以是任何东西
在现代图书馆和webapps中,都经常使用它来降低重复操作的性能成本。简而言之,记忆是指在第一次运行后,为给定输入存储给定函数的输出。
地图是存储这些数据的最佳选择,因为您可以使用它们,而无需考虑索引依据
const cache=newmap();
常量输入=[2,3,2];//为了简单起见,假设这是不可变的
函数昂贵(n,…args){
如果(!args.length)返回n;
返回Math.pow(n,昂贵(…args));
}
功能(arr){
const memoResult=cache.get(arr);
如果(记忆结果){
console.log('used memo',memoResult);
返回记忆结果;
}
常数结果=昂贵(…arr);
console.log('计算',结果);
cache.set(arr,result);
返回结果;
}
备忘录(输入);
备忘录(输入)代码>它们有不同的用途。映射和数组根本不一样。贴图允许使用键进行选择,这些键可以是任何参考值或基本值。此外,通过WeakMap,您可以利用高效的垃圾收集。我认为更好的问题是,你认为是什么使它们可以互换?这里有一系列使用Map的理由。这对后代来说是一个重大问题。真遗憾它关门了。在S.O.上有很多类似的高投票率的问题。我想他们指的是地图,一个可编辑的类@哮喘我不明白你的意思。我谈到了相同的Map
right?中间数组?为何这里唯一不利于内存使用的操作就是使用delete
操作符。你有详细解释的链接吗?