set和map数据结构
故心故心故心故心小故冲啊
一、set数据结构
//JS数据结构 Array Object Set Map
var arr1 = new Array();
var arr2 = [3,4,5,6,7,7,8];
arr2.push(1);
arr2[1] = 2;
var obj = new Object();
var obj2 = {}
var set = new Set(); //类似于数组,成员是唯一的 全等进行匹配
set.add(4);
set.add(2);
set.add(3).add(4).add(5).add('5');
// {4, 2, 3, 5,'5'}
//另一种定义方式
var set2 = new Set([3,4,5,6,7,7,8]);
console.log(set2); //{3,4,5,6,7,8}
//数组去重
var arr3 = [1,2,1,2,3,4,2,3,4,3,2,3,4,2,3,4,2,5];
var s = new Set(arr3); //{1,2,3,4,5}
//es5
function f(){
var arr = [];
for(var i = 0;i<arr3.length;i++){
if(arr.indexOf(arr3[i])==-1){ //没有匹配成功
arr.push(arr3[i])
}
};
return arr;
}
//类型转换
//1、...扩展运算符
var arr4 = [...new Set(arr3)]; //[1, 2, 3, 4, 5]
//2、Array.from()
var arr5 = Array.from(new Set(arr3)) // [1, 2, 3, 4, 5]
//求出大于20的数据且去重处理
var arr6 = [10,23,42,23,14,23,42,23,10,55,23,43,42,55,67,42,20,20];
var x = [...new Set(arr6.filter(v=>v>20))];
console.log(x); //[23, 42, 55, 43, 67]
//分析思路
//1、求出大于20
// var max = arr6.filter(function(v){
// return v>20
// });
var max = arr6.filter(v=>v>20); //[23, 42, 23, 23, 42, 23, 55, 23, 43, 42, 55, 67, 42]
//2、去重
var y = new Set(max); //{23, 42, 55, 43, 67}
//3、类型转换
Array.from(y); //[23, 42, 55, 43, 67]
[...y];
//4、合并代码
var x2 = Array.from(new Set(arr6.filter(v=>v>20)));
var x3 = [...new Set(arr6.filter(v=>v>20))];
//取二组数据的并集,交集,差集且去重
var a1 = [1,2,3,4,5,6,4,5,6];
var a2 = [4,5,6,7,8,9,7,8,9];
//并集:
//1、数组合并
var merge = [...a1,...a2];
//2、去重
var noDuplicate = new Set(merge);
//3、类型转换
var a3 = [...noDuplicate];
//4、合并代码
var a3 = [...new Set([...a1,...a2])];
//遍历方法
const set = new Set([2,3,52,3,4,43,3]);
for(let v of set){
console.log(v)
}
set.forEach((v,i)=>{
console.log(v)
});
二、map数据结构
// map 类似于object 键值对
var m = new Map();
m.set('key','value');
m.set('name','jindu').set('a','a');
var o = {id:100};
m.set(o,'abc');
//另一种添加方式(二维数组的方式添加进来)
let m1 = new Map([['a',1],['b',2],['c',3],['id',4]]);
// Map实例的属性和方法
//size属性
const m = new Map();
m.set('a','a').set('b','b');
m.size //2
//set(key, value)
const m = new Map();
m.set('qq', '2429462491') // 键是字符串
m.set(100, 'jindu') // 键是数值
m.set(undefined, 'value') // 键是 undefined
//get(key) 读取`key`对应的键值,如果找不到`key`,返回`undefined`。
const m = new Map();
var a = {id:2};
m.set(a,'value');
m.set('name','jindu');
m.get(a); //'value' 通过变量a来获取
m.get('name'); //jindu 通过'name'属性获取
//has(key) 返回一个布尔值,表示某个键是否在当前 Map 对象之中。
const m = new Map();
var a = {id:2};
m.set(a,'value');
m.set('name','jindu');
m.has('name') //true
m.has('a') //false
m.has(a) //true
//delete(key) 删除某个键,返回`true`。如果删除失败,返回`false`。
const m = new Map();
var a = {id:2};
m.set(a,'value');
m.set('name','jindu');
m.delete('name')
m.has('name') //false
//clear() 清除所有成员,没有返回值。
const m = new Map();
var a = {id:2};
m.set(a,'value');
m.set('name','jindu');
m.clear();
let m1 = new Map([['a',1],['b',2],['c',3],['id',4]]);
// Map遍历方法
for(let [k,v] of m1){
console.log(k);
console.log(v);
};
//keys() //MapIterator {"a", "b", "c", "id"}
//values() //MapIterator {1, 2, 3, 4}
//entries() // MapIterator {"a" => 1, "b" => 2, "c" => 3, "id" => 4}
for(let k of m1.keys()){
console.log(k);
};
for(let v of m1.values()){
console.log(v);
};
//map类型转换
//1、对象转数组 Object.keys(对象) Object.values(对象)
var obj = {'a':1,'b':2,'c':3};
Object.keys(obj); //["a", "b", "c"]
Object.values(obj); //[1, 2, 3]
//2、map类型转数组 keys() values() + 扩展运算符
let m1 = new Map([['a',1],['b',2],['c',3],['id',4]]);
[...m1.keys()]; //["a", "b", "c", "id"]
[...m1.values()];
[...m1]; //[['a',1],['b',2],['c',3],['id',4]]
//3、map转对象object for...of 逐一获取
let m2 = new Map([['a',1],['b',2],['c',3],['id',4]]);
var o2 = {};
for(let [k,v] of m2){
o2[k] = v;
};
console.log(o2) //{a: 1, b: 2, c: 3, id: 4}
//4、对象object转map for in 逐一set加进去
var obj = {'a':1,'b':2,'c':3};
let m3 = new Map();
for(let k in obj){
m3.set(k,obj[k]);
};
console.log(m3);
//二种方式 Object.entries(obj) //是一个二维数组
let m4 = new Map(Object.entries(obj));
三、for.of的用法
const arr = ['red', 'green', 'blue'];
//es6
for(let v of arr) {
console.log(v); // red green blue
}
//能不能获取arr的索引
for(let [i,v] of arr.entries()) {
console.log(i); // 0
console.log(v); //1
}
//es5
for(let i in arr){
console.log(i) //0 1 2
console.log(arr[i]);
}
for(var i = 0;i<arr.length; i++){
console.log(arr[i]);
console.log(i);
}
arr.forEach(function(item,index) {
console.log(item); // red green blue
console.log(index); // 0 1 2
});
//set遍历
const set = new Set([2,3,52,3,4,43,3]);
for(let v of set){
console.log(v)
}
//map遍历
let m1 = new Map([['a',1],['b',2],['c',3],['id',4]]);
for(let [k,v] of m1){
console.log(k);
console.log(v);
};
for(let k of m1){
console.log(k);
};
//["a", 1]
//object
var obj = {'a':1,'b':2,'c':3};
for(let k of obj){
console.log(k); //obj is not iterable
};
for(let k in obj){
console.log(k);
console.log(obj[k]);
};
//解决方法 转为数组
for(let k of Object.keys(obj)){ //Object.keys(obj); //["a", "b", "c"]
console.log(k);
};
for(let [k,v] of Object.entries(obj)){
console.log(k);
console.log(v);
};
var arr = [2,3,4,5,6];
for(let v of arr){
if(v ==3){
break; //2
//continue; //2 4 5 6
};
console.log(v)
}
总结
类型转换(重点):
1、对象转数组 Object.keys(对象) Object.values(对象)
2、map类型转数组 keys() values() + 扩展运算符
3、map转对象object for…of 逐一获取
4、对象object转map for…in 逐一set加进去或者(new Map(Object.entries(obj)))