Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript映射对象与集合对象_Javascript - Fatal编程技术网

javascript映射对象与集合对象

javascript映射对象与集合对象,javascript,Javascript,JavaScript和对象都是。两者都通过[键,值]对存储对象。我想知道什么时候用什么?是否有一种优于另一种的偏好?如果您谈论的是ES6类型,那么它们不是相同的数据结构,即使可能使用一个 您对Map的定义是正确的,但是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()

JavaScript和对象都是。两者都通过
[键,值]
对存储对象。我想知道什么时候用什么?是否有一种优于另一种的偏好?

如果您谈论的是ES6类型,那么它们不是相同的数据结构,即使可能使用一个

您对
Map
的定义是正确的,但是
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);
类似地,在ES6中,我们可以使用正则对象

var map = new Map();
map.set("name","Anand Deep Singh");
console.log(map.get("name")); //logs "Anand Deep Singh"
但值得注意的是,映射不是用文本对象语法创建的,它使用集合获取方法来存储访问数据

它有一个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"}
集合不能像数组一样访问,它提供了与映射相同的方法。

Summary:
  • 当数据集需要由唯一值组成时,请使用
    集合
  • 当有关联数据的对时,使用
    映射。将键映射到值
示例
设置
:
有一个与来自不同组织的人的会议。有些人来自同一个组织。我们需要列出所有不同的组织。为此,我们可以使用集合,因为我们只希望包含每个组织一次:

const组织=新集合();
组织。添加('org1');
组织。添加('org2');
组织。添加('org3');
组织。添加('org1');
组织。添加('org3');
组织。添加('org1');
for(让组织的组织){
console.log(org);

}
有两种主要的数据结构:

  • 对象: 用于存储键控集合
  • 阵列: 用于存储有序集合
但现实生活中这还不够。这就是为什么地图和集合也存在的原因

  • 地图: 是键控数据项的集合,就像对象一样。但主要的区别是Map允许任何类型的键
例如:

let map = new Map();

map.set('1', 'str1');   // a string key
map.set(1, 'num1');     // a numeric key
map.set(true, 'bool1'); // a boolean key


let hamid = { name: "Hamid" };
// john is the key for the map
map.set(hamid, 123);
  • 设置 :是一个特殊类型集合–“值集”(不带键),其中每个值只能出现一次
实例:

let map = new Map();

map.set('1', 'str1');   // a string key
map.set(1, 'num1');     // a numeric key
map.set(true, 'bool1'); // a boolean key


let hamid = { name: "Hamid" };
// john is the key for the map
map.set(hamid, 123);
let set = new Set();

let hamid= { name: "Hamid" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// visits, some users come multiple times
set.add(hamid);
set.add(pete);
set.add(mary);
set.add(hamid);
set.add(mary);

// set keeps only unique values
alert( set.size ); // 3
 

我认为有必要明确指出集合不是键值存储。它与数组的不同之处在于它没有顺序。在Map()中,键可以是任何类型[字符串、数字、对象],但在常规对象中,键必须是字符串类型。Set是一维唯一数组,而Map是二维的,并且有键值对,where key应该是唯一的。
开发人员在需要映射时通常只使用常规JavaScript对象。
您能详细说明一下吗?这完全取决于您的需求和您实现问题解决方案的方式。如果要保存任何数据,我通常使用数组或对象文字。我几乎不使用两者,这就是为什么这一切都取决于你:)我不会宣传“开发人员通常在需要映射时只使用常规JavaScript对象。”作为答案的标题。虽然使用对象而不是贴图可能有意义,但情况并非总是如此(正如您已经指出的)。这样的声明可以也将导致新的JS开发人员采用错误的习惯。请删除该标题,并使您的答案更明确。我更新了答案。虽然当时我写这封回信的时候并不常见,但这就是我写这封回信的原因。虽然谢谢你提醒我(:这里有一篇很好的文章,很好地解释了事情: