Set
集合型的数据结构
类似于数组,set的值是唯一的,只有元素的键,没有值(键就是值,值就是键)。不能使用索引来获取元素(以上特点符合集合的概念)。
属性
size ——返回集合中所有不重复元素的个数值
let set1 = new Set([1, "洋葱", 3, 4, "洋葱", 5, 5])
console.log(set1.size);//结果:5
方法
add()
- 添加某个值,返回
set本身(可以使用链式调用:set.add().add())
let set1 = new Set([1, "洋葱", 3, 4, 5])
set1.add(4).add(8).add(9);//链式调用
console.log(set1);
delete()
- 删除某个值,删除成功返回
true,删除失败返回false
let set1 = new Set([1, "洋葱", 3, 4, 5])
console.log(set1.delete(7));//flase
console.log(set1.delete(3));//true
has()
- 判断是否含有某个值,可以返回一个布尔值
let set1 = new Set([1, "洋葱", 3, 4, 5])
console.log( set1.has(5));//true
clear
- 清空所有元素 遍历
- 可以使用
for Each或者for of遍历
//注意和遍历数组的区分,index并不代表数组的索引(因为set是集合型数据结构,值唯一,所以遍历的时候查找的是值也可以称作键)
let set1 = new Set([1, "洋葱", 3, 4, 5])
set1.forEach((item,index)=>{
console.log(item);
console.log(index);
})
let set1 = new Set([1, "洋葱", 3, 4, 5])
for (const item of set1) {
console.log(item);
}
Map
字典型的数据结构
Map 中存储的map的结构是 “键:值 (K:V)” , 其中的 键 和 值 可以是任何类型的。 Map可以有重复的值,但是不能有重复的键。
属性
size ——键值对的个数
方法
set(k,v)添加一个键值对var v = get(k)通过键,获取值。delete通过键,删除一个键值对clear清空
遍历
//定义一个Map对象
const map = new Map([
['name', "洋葱"],
['age', 7],
])
//`keys()`返回键名
for (let key of map.keys()) {
console.log(key)// "name" "age"
}
//values()返回值
for (let value of map.values()) {
console.log(value)//洋葱 7
}
// "for....of.... "和"entries()"遍历键值对
for (let item of map.entries()) {
console.log(item)//name:洋葱 age:7
}
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value)
}
//### for...of...遍历map等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value)
}
//"for.....each....."遍历键值对
map.forEach((v,k)=>{
console.log("v=>"+v);//结果:v=>7
console.log("k=>"+k);//结果:k=>洋葱
})
英汉词典案例(数据在本地)
需求:输入英文单词从本地数据库中得到对应汉语意思
<div id="dict">
<input type="text" id="word" placeholder="请输入英文单词">
<div id="desc"></div>
</div>
<script src="js/dict.js"></script>
window.onload = function () {
//将字符串按照换行进行分割
let arr = word.split("\n");
//两两分成一组。 第一行 是 key 第二行是value
let map = new Map();
for (var i = 0; i < arr.length - 1; i += 2) {
//获取 单词 不留前一个#
let inpword = arr[i].substring(1);
//获取 翻译 不留前6个字符
let desc = arr[i + 1].substring(6);
map.set(inpword, desc);
}
// 输入框只要有输入的内容,就开始查询
const inp = document.getElementById('word');
const desc = document.getElementById('desc');
inp.oninput = function () {
//获取输入框的值,根据值去map中查询。
let value = map.get(inp.value.trim());
//如果输入框有值则
if (value) {
desc.innerHTML = value;
}
//否则
else {
desc.innerHTML = "查无此词";
}
}
}
引入的js/dict.js数据格式为
总结
Set
- 集合的数据结构(ES6新增),
Array.from方法可以将Set结构转为数组 - 成员唯一、无序且不重复
[value, value]只有键值,没有键名- 可储存任何类型的唯一值
- 可以遍历,方法有:
add、delete、has、clear,可以间接使用数组的方法 Map - 字典数据结构,本质上是键值对的集合
- 可以遍历,可以进行结构转换
- 方法有:
set、get、has、delete、clear结构类型转换
//map转数组
let map = new Map()
let arr = [...map]
//数组转map
Map: map = new Map(arr)
//map转对象
let obj = {}
for (let [k, v] of map) {
obj[k] = v
}
//对象转为 Map
for( let k of Object.keys(obj)){
map.set(k,obj[k])
}