javascript Map对象与Set对象

nzn*_*oor 35 javascript

JavaScript MapSet对象都是可迭代的对象.两者都[key, value]成对存储对象.我想知道什么时候用什么?有没有偏好?

Dan*_*ite 46

如果您在讨论ES6类型,它们的数据结构并不相同,即使Set可能使用了Map.

您的定义Map是正确的,但a Set是唯一值的集合,与可能具有重复的数组不同.

var array = [1, 2, 3, 3];

var set = new Set(array); // Will have [1, 2, 3]
assert(set.size, 3);

var map = new Map();
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);
map.set('C', 3);
map.set('a', 4); // Has: a, 4; b, 2; c: 3, C: 3
assert(map.size, 4);
Run Code Online (Sandbox Code Playgroud)

  • 我认为明确指出Set不是键值存储是值得的.它与数组的不同之处在于它没有排序. (17认同)
  • 在 Map() 中,键可以是任何类型 [String, number, Object] 但在常规对象中键必须是字符串类型。 (7认同)
  • Set是一维唯一数组,而Map是二维的,有键值对,其中key必须是唯一的。 (3认同)

Ana*_*ngh 14

开发人员通常只在需要地图时使用常规JavaScript对象.

var obj = {};
obj.name= "Anand Deep Singh";
console.log(obj.name); //logs "Anand Deep Singh"
Run Code Online (Sandbox Code Playgroud)

同样在ES6中,我们可以使用常规对象.

var map = new Map();
map.set("name","Anand Deep Singh");
console.log(map.get("name")); //logs "Anand Deep Singh"
Run Code Online (Sandbox Code Playgroud)

但值得注意的是,Map不是使用文字对象语法创建的,而是使用setget方法来存储访问数据.

它有一个has方法来检查对象中是否存在键,delete方法删除对象,clear方法清除整个对象.

Set是唯一的值列表.这只是一个独特的清单.

var set = new Set(["a", "a","e", "b", "c", "b", "b", "b", "d"]);
console.log(set); //logs Set {"a", "e", "b", "c", "d"}
Run Code Online (Sandbox Code Playgroud)

无法像数组一样访问集合,它提供与Map相同的方法.

  • `开发人员在需要地图时通常只使用常规的 JavaScript 对象。` 你能详细说明一下吗? (3认同)
  • 我不会宣传“开发人员在需要地图时通常只使用常规 JavaScript 对象”。作为答案的标题。虽然使用对象而不是映射可能有意义,但情况并非总是如此(正如您已经指出的那样)。这样的说法可能并且将会导致新的 JS 开发人员养成错误的习惯。请删除该标题并使您的答案更加明确。 (2认同)

Wil*_*een 6

摘要:

  • Set当您的数据集需要由唯一值组成时,请使用
  • Map当您有关联数据时,请使用。您将键映射到值

范例Set

有来自不同组织的人开会。有些人来自同一组织。我们需要组成所有不同组织的列表。为此,我们可以使用一个集合,因为我们只想包含每个组织一次:

const organization = new Set();

organization.add('org1');
organization.add('org2');
organization.add('org3');
organization.add('org1');
organization.add('org3');
organization.add('org1');

for(let org of organization){
  console.log(org);
}
Run Code Online (Sandbox Code Playgroud)

范例Map

我们有一包狗,希望为每只狗指定年龄。我们想将每只狗的唯一名称映射到狗的年龄:

const dogs = new Map([['fluffy', 10], ['barkie', 13]]);

dogs.forEach((value, key) => console.log(key, value));
Run Code Online (Sandbox Code Playgroud)

与的Map区别是Object什么?

An Object也是键值对的集合,通常可以实现与罐子相同的目的Map(创建键值对)。但是,a Map和an 之间存在一些关键区别Object

  • Map内置于Iterable中,这使它可以使用普通JS 无法使用的for of循环或forEach()方法的实现Object
  • Map在其上具有一些不错的内置方法,prototype这使得使用它非常好。因为al Objects继承自Object.prototypeis可以访问更多有用的方法。例如,size()on方法Map将返回中的键数Map