Set

Set

用于存储任何类型的唯一值,可以是基本类型或者是对象引用

  • 只能保存值没有键名
  • 值是唯一的
  • 遍历顺序是添加的顺序,方便保存回调函数

Set类型与Array和Object的对比

数组可以存放任何数据

let arr = [1, 1, 1, 1, 1, 1];
console.table(arr);

image-20200923171032183

Set不能存放相同的数据

let set = new Set([1, 2, 3, 4, 5]);
set.add(1);
set.add("1");
console.log(set);

image-20200923171051208

Set中只保存了一个1

对象中 存在相同的键,后面的会把前面的覆盖

let obj = {
    1: "a",
    "1": "b"
};

image-20200923171020687

如果用一个对象作为另一个对象的属性,系统会把这个对象转换为字符串

let obj = {
    1: "a",
    "1": "b"
};

let hd = {
    [obj]: "小夜勃"
};

打印 hd

image-20200923170933918

获取元素数量

let set = new Set(['a', 'b']);
console.log(set.size); //2

元素检测

检测元素是否存在

let set = new Set(['a', 'b']);
console.log(set.has("a")); True

删除元素

使用delete方法可以删除单个元素,返回值为boolean类型

let set = new Set(['a', 'b']);
console.log(set.delete("a")); //true
console.log(set.has("a")); //false

使用clear方法可以清除所有元素

let set = new Set(['a', 'b']);
set.clear();
console.log(set.values());

image-20200923191701000

数组转换

使用点语法或者Array.form可以将Set类型转换为数据

const set = new Set(["boreas", "object"]);
console.log([...set]); //["boreas", "object"]
console.log(Array.from(set)); //["boreas", "object"]

image-20200923191919308

去除重复

去除字符串重复

console.log([...new Set("object")].join(""));//object

去除数组重复

const arr = [1, 2, 3, 5, 2, 3];
console.log(...new Set(arr)); // 1,2,4,5

遍历数据

使用 keys()/values()/entries() 都可以返回一个迭代对象,因为set类型只有值,所以 keys与values 方法返回的结果一致

const hd = new Set(["baidu", "object"]);
console.log(hd.values()); //SetIterator {"baidu", "object"}
const hd = new Set(["baidu", "object"]);
console.log(hd.keys()); //SetIterator {"baidu", "object"}
const hd = new Set(["baidu", "object"]);
console.log(hd.entries()); //SetIterator {"baidu" => "baidu", "object" => "object"}

可以使用forEach遍历Set数据

let arr = [7, 6, 2, 8, 2, 6];
let set = new Set(arr);
//使用forEach遍历
set.forEach((item,key) => console.log(item,key));

使用forof也可以遍历Set

let set = new Set([7, 6, 2, 8, 2, 6]);

for (const value of set) {
	console.log(value);
}

Set搜索案例

HTML

 <input type="text" name="hd" />
  <ul></ul>

CSS

body {
    padding: 200px 800px;
}

ul {
    list-style: none;
    padding: 0;
    margin: 0;
    width: 200px;
}

li {
    border: solid 1px #ddd;
    padding: 10px;
}

li:nth-of-type(odd) {
    background: yellowgreen;
}

JavaScript

let obj = {
    // 声明一个Set,用来存放数据
    data: new Set(),
    // 往Set中添加数据
    keyword(word) {
        this.data.add(word);
    },
    // 显示Set数据
    show() {
        let ul = document.querySelector("ul");
        ul.innerHTML = "";
        this.data.forEach(function (value) {
            ul.innerHTML += `<li>${value}</li>`;
        });
    }
};
let input = document.querySelector("[name='hd']");
input.addEventListener("blur", function () {
    obj.keyword(this.value);
    obj.show();
});

WeakSet

WeakSet结构同Set一样,不会保存相同的值,但是它的值必须只能是对象类型的值。

  • WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不能进行forEach( )遍历等操作
  • WeakSet 是弱引用,WeakSet 结构没有keys( )values( )entries( )等方法和size属

声明定义

下列操作会触发报错,因为存储的值不是对象类型

new WeakSet(["baidu", "object"]); //Invalid value used in weak set

new WeakSet("baidu"); //Invalid value used in weak set

image-20200923194141149

WeakSet的值必须为对象类型

new WeakSet([["baidu"], ["object"]]);

将DOM节点保存到WeakSet

document.querySelectorAll("button").forEach(item => Wset.add(item));

基本语法

添加操作

  let set = new WeakSet();
  set.add(['object'])

删除操作

  let set = new WeakSet();
  set.add(['object'])
  set.delete(arr);

检索操作

  let set = new WeakSet();
  set.add(['object'])
  console.log(set.has(object)); true

WeakSet案例

GIF 2020-9-23 20-06-29

HTML

 <ul>
    <li>baidu.com <a href="javascript:;">x</a></li>
    <li>taoabo.com <a href="javascript:;">x</a></li>
    <li>meituan.com <a href="javascript:;">x</a></li>
  </ul>

CSS

  * {
    padding: 0;
    margin: 0;
  }

  body {
    padding: 100px;
  }

  ul {
    list-style: none;
    display: flex;
    width: 200px;
    flex-direction: column;
  }

  li {
    height: 30px;
    border: solid 2px #e67e22;
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-left: 10px;
    color: #333;
    transition: 1s;
  }

  a {
    border-radius: 3px;
    width: 20px;
    height: 20px;
    text-decoration: none;
    text-align: center;
    background: #16a085;
    color: white;
    cursor: pointer;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-right: 5px;
  }

  .remove {
    border: solid 2px #eee;
    opacity: 0.8;
    color: #eee;
  }

  .remove a {
    background: #eee;
  }

JavaScript

class Todo {
    constructor() {
        this.items = document.querySelectorAll("ul>li");
        this.lists = new WeakSet();
        this.items.forEach(item => this.lists.add(item));
    }
    run() {
        // console.log(this)
        this.addEvent();
    }
    addEvent() {

        this.items.forEach(item => {
            console.log(item)
            let a = item.querySelector("a");
            a.addEventListener("click", event => {
                const parentElement = event.target.parentElement;
                if (this.lists.has(parentElement)) {
                    parentElement.classList.add("remove");
                    this.lists.delete(parentElement);
                } else {
                    parentElement.classList.remove("remove");
                    this.lists.add(parentElement);
                }
            });
        });
    }
}
new Todo().run();

nt.target.parentElement;
if (this.lists.has(parentElement)) {
parentElement.classList.add(“remove”);
this.lists.delete(parentElement);
} else {
parentElement.classList.remove(“remove”);
this.lists.add(parentElement);
}
});
});
}
}
new Todo().run();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值