前端基础学习

Map类型

2020-04-26  本文已影响0人  小雪洁
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Map类型</title>
    </head>
    <body>
    </body>
    <script>
        //对象的属性也就是键名,只能是字符串
        //但是Map类型的键名可以是字符串、数字、对象、函数等
        //Map中的属性也不能重复
        let map =new Map();
        map.set("name","hxj");
        map.set(function(){},"ydc");
        map.set({},"hwx");
        map.set(1,"hql");
        console.log(map);
        let map1=new Map([['name','hxj'],['name',"ydc"]]);
        console.log(map1);//Map(1) {"name" => "ydc"} 只有一个元素,
        let map2=new Map([['name','hxj'],['age',30]]);
        console.log(map2);//Map(2) {"name" => "hxj", "age" => 30}
        //Map类型链式添加操作
        map2.set('address',"衡水")
            .set('id',12334);
        //Map(4) {"name" => "hxj", "age" => 30, "address" => "衡水", "id" => 12334}
        console.log(map2);
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Map类型的增删清空</title>
    </head>
    <body>
    </body>
    <script>
        //对象为键名的Map类型对象
        let obj={
            name:"hxj"
        };
        let map =new Map();
        map.set(obj,'haoxuejie');
        //给map添加元素
        map.set("age",30);
        console.log(map);//Map(2) {{…} => "haoxuejie", "age" => 30}
        //获取元素
        console.log(map.get("age"));//30
        console.log(map.get(obj));//haoxuejie
        //查找元素是否存在
        console.log(map.has("age"));//true
        console.log(map.has("ss"));//false
        //删除元素
        console.log(map.delete("age"));//true
        console.log(map);//Map(1) {{…} => "haoxuejie"}
        //清空元素
        map.clear();
        console.log(map);//Map(0) {}
        //查找元素是否存在
        
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Map类型转换</title>
    </head>
    <body>
    </body>
    <script>
        //a类型办不到的事,转成b类型,然后再转回a
        let map=new Map([['name','hxj'],['age',30]]);
        //转换键值对
        console.log(...map);//转成了两个数组,分别为["name", "hxj"],["age", 30]
        console.log([...map]);//转成了一个含有两个数组的一个数组[['name','hxj'],['age',30]]
        //转换键
        console.log(...map.keys());//转成了非数组 name age
        console.log([...map.keys()]);//转成了数组["name", "age"]
        //转换键值
        console.log(...map.values());//hxj 30
        console.log([...map.values()]);//["hxj", 30]
        //筛选map中含有'hxj'的元素
        console.log("筛选map中含有'hxj'的元素");
        let arr=[...map].filter(item=>{
            return item.includes("hxj");
        });
        console.log(arr);
        let newmap =new Map(arr);
        console.log(newmap);//Map(1) {"name" => "hxj"}
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Map类型转换</title>
    </head>
    <body>
    </body>
    <script>
        //a类型办不到的事,转成b类型,然后再转回a
        let map=new Map([['name','hxj'],['age',30]]);
        //转换键值对
        console.log(...map);//转成了两个数组,分别为["name", "hxj"],["age", 30]
        console.log([...map]);//转成了一个含有两个数组的一个数组[['name','hxj'],['age',30]]
        //转换键
        console.log(...map.keys());//转成了非数组 name age
        console.log([...map.keys()]);//转成了数组["name", "age"]
        //转换键值
        console.log(...map.values());//hxj 30
        console.log([...map.values()]);//["hxj", 30]
        //筛选map中含有'hxj'的元素
        console.log("筛选map中含有'hxj'的元素");
        let arr=[...map].filter(item=>{
            return item.includes("hxj");
        });
        console.log(arr);
        let newmap =new Map(arr);
        console.log(newmap);//Map(1) {"name" => "hxj"}
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Map类型操作dom元素</title>
    </head>
    <body>
        <div name="hxj">haoxuejie</div>
        <div name="ydc">yangdingchuan</div>
    </body>
    <script>
        //我们要给div节点加点击事件,点击div时弹出其name的属性值
        //核心就是用Map类型的键保存dom对象,值保存所需要的附加信息
        let divs=document.querySelectorAll("div");
        let map=new Map();
        divs.forEach(item=>{
            map.set(item,{
                content:item.getAttribute('name')
            });
        });
        console.log(map);//Map(2) {div => {…}, div => {…}}
        //注意map里面的键是div,是一个dom节点对象,值是content;
        map.forEach((config,item)=>{
            //forEach()中config是值,item是键即dom节点
            item.addEventListener('click',()=>{
                alert(config.content);
            })
        })
        //console.log(map);
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>使用Map类型控制表单提交</title>
    </head>
    <body>
        <form action="" onsubmit="return post()">
            <input type="checkbox" name="agreement" error="请接受协议" />
            接受协议
            <input type="checkbox" name="student" error="网站只对学生开放" />
            我是学生
            <input type="submit"/>
        </form>
        
    </body>
    <script>
        
        //如果不勾选接受协议就提交就弹出error信息
        /* function post(){
            //let map= new Map();
            //找到所有的input,
            let agree=document.querySelector("input[name='agreement']");
            //let agree=inputs.querySelector("");
            //console.log(agree.getAttribute("error"));
            //console.log(agree.checked);//false
            if(agree.checked==false){
                alert(agree.getAttribute("error"));
            }
            return false
        } */
        
        function post(){
            let map= new Map();
            //找到所有带有错误信息的input,
            let inputs=document.querySelectorAll("input[error]");
            //给map里面压入数据,
            //Map类型一个很大的特点就是键里面可以存放很多内容
            inputs.forEach(item=>{
                map.set(item,{
                    error:item.getAttribute("error"),
                    status:item.checked
                });
            });
            //every(())里面使用解构赋参数
            console.log([...map]);
            return [...map].every(([elem,config])=>{
                //elem是map里的键即dom节点,config是map里的值
                //使用短路特性,如果status为真不弹出错误,否则弹出错误信息
                config.status||alert(config.error);
                //因为every()是全部为真函数值为真,把status返回,status都为真时就能提交了
                return config.status;
            });
        }
    </script>
</html>
上一篇下一篇

猜你喜欢

热点阅读