首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在什么情况下,您会选择使用Map而不是普通数组?

在什么情况下,您会选择使用Map而不是普通数组?
EN

Stack Overflow用户
提问于 2019-08-20 03:54:15
回答 4查看 1.1K关注 0票数 1

当使用Map而不是普通数组更可取时,我很难找到一个真实的情况。只是看起来每次都很难使用。

你有没有尝试一个合适的案例?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2019-08-20 05:41:58

当你想创建一个将键映射到值的数据结构时使用map,这对我很有用,比如在自然语言处理期间,我们有不同的命令必须绑定到关键字,然后可以通过这些关键字直接访问这些关键字-而数组只是一个包含和索引其内容的容器。如果要访问数组的内容,则需要指定索引或运行条件比较来查找查询

票数 1
EN

Stack Overflow用户

发布于 2019-08-20 05:52:16

V8引擎堆不太擅长管理对象数组。如果您有一个包含100,000个对象的数组,循环每个对象并删除中间的一个参数,然后重新添加它,堆大小将达到峰值,而不是保持不变。

代码语言:javascript
复制
// 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这样的库来为它们获取类似数组的转换方法。

票数 1
EN

Stack Overflow用户

发布于 2019-08-20 08:15:39

作为covered briefly by MDNMap有许多技术优势-虽然简单的ArrayObject可能足以满足简单的数据结构,但通常情况下,现代web开发的日益复杂证明使用其他东西是合理的。

让我们看几个具体的例子:

Map 的密钥可以是

在现代图书馆和webapps中,memoization经常被用来降低重复性操作的性能成本。简而言之,记忆化是存储第一次运行后给定输入的给定函数的输出的行为。

地图是存储这些数据的一个很好的候选者,因为您可以使用它们,而不管您想通过什么来建立索引。

代码语言:javascript
复制
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

代码语言:javascript
复制
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将保持插入关键点的顺序,而不考虑它们的类型。

代码语言:javascript
复制
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,即时执行和保证顺序是两个例子。

代码语言:javascript
复制
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 Asthmaticavoiding Object prototype issuesconvenience等,还有很多其他的好处。

希望这篇一般性概述已经涵盖了您遇到的大多数问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57563144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档