JavaScript的數(shù)據(jù)結(jié)構(gòu)-集合 |技術(shù)點(diǎn)評(píng)
Github來(lái)源:力扣 (LeetCode)|刷題打卡 | 求星星 ? | 給個(gè)??關(guān)注,??點(diǎn)贊,??鼓勵(lì)一下作者
[已開啟]任務(wù)一:刷題打卡 * 10 篇
哪吒人生信條:如果你所學(xué)的東西 處于喜歡 才會(huì)有強(qiáng)大的動(dòng)力支撐。
每天學(xué)習(xí)編程,讓你離夢(mèng)想更新一步,感謝不負(fù)每一份熱愛編程的程序員,不論知識(shí)點(diǎn)多么奇葩,和我一起,讓那一顆四處流蕩的心定下來(lái),一直走下去,加油,2021加油!歡迎關(guān)注加我vx:xiaoda0423,歡迎點(diǎn)贊、收藏和評(píng)論
時(shí)間:3 月 1 日 ~ 3 月 13 日
力扣 (LeetCode)-兩數(shù)之和,有效的括號(hào),兩數(shù)相加|刷題打卡-3月1日 力扣 (LeetCode)-合并兩個(gè)有序鏈表,刪除排序數(shù)組中的重復(fù)項(xiàng),JavaScript筆記|刷題打卡-3月2日 力扣 (LeetCode)-最大子序和,JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(數(shù)組)|刷題打卡-3月3日 針對(duì)CSS說一說|技術(shù)點(diǎn)評(píng)-3月4日 力扣 (LeetCode)-棧,括號(hào)生成 |刷題打卡-3月5日 原來(lái)也沒有那么難!Vue商城開發(fā) | 技術(shù)點(diǎn)評(píng)-3月6日 力扣 (LeetCode)-加一,隊(duì)列 |刷題打卡-3月7日 JavaScript數(shù)據(jù)結(jié)構(gòu)之鏈表 | 技術(shù)點(diǎn)評(píng)-3月8日
前言
如果這篇文章有幫助到你,給個(gè)??關(guān)注,??點(diǎn)贊,??鼓勵(lì)一下作者,接收好挑戰(zhàn)了嗎?文章公眾號(hào)首發(fā),關(guān)注 程序員哆啦A夢(mèng) 第一時(shí)間獲取最新的文章
??筆芯??~
數(shù)組,棧,隊(duì)列,鏈表
集合
集合是由一組無(wú)序且唯一的項(xiàng)組成的,(不能重復(fù)),可以理解為集合是一個(gè)既沒有重復(fù)元素,也沒有順序概念的數(shù)組。
并集,交集,差集
// 使用ES6中的Set類
function Set() {
let items = {};
}
add(value),向集合添加一個(gè)新的項(xiàng)delete(value),從集合移除一個(gè)值has(value),如果值在集合中,返回true,否則返回falseclear(),移除集合中的所有項(xiàng)size(),返回集合所包含元素的數(shù)量values(),返回一個(gè)包含集合中所有值的數(shù)組
has(value)方法
this.has = function(value) {
return value in items;
};
this.has = function(value) {
return items.hasOwnProperty(value);
};
實(shí)現(xiàn)add方法:
this.add = function(value) {
if(!this.has(value)) {
// 如果不存在,就把value添加到集合中
items[value] = value;
return true;
}
return false;
};
添加一個(gè)值的時(shí)候,把它同時(shí)作為鍵和值保存,因?yàn)檫@樣有利于查找這個(gè)值。
實(shí)現(xiàn)remove方法:
this.remove = function(value) {
if(this.has(value)) {
// 如果存在,就從集合中移除value
delete items[value];
return true;
}
return false;
};
使用Set類的示例代碼:
let set = new Set();
set.add(1);
set.add(2);
移除集合中的所有值:
// clear方法
this.clear = function() {
items = {}
};
size方法
使用一個(gè) length變量,每當(dāng)使用add或remove方法時(shí)控制它,像使用LinkedList類一樣示例:
this.size = function() {
// 返回一個(gè)包含給定對(duì)象所有屬性的數(shù)組
return Object.keys(items).length;
};
示例:
this.sizeLegacy = function() {
let count = 0;
for(let key in items) {
// 遍歷items對(duì)象的所有屬性
if(items.hasOwnProperty(key))
// 檢查它們是否是對(duì)象自身的屬性
// 如果是,遞增count變量的值
++count;
}
// 最后在方法結(jié)束時(shí)返回這個(gè)數(shù)字
return count;
};
values方法,提取items對(duì)象的所有屬性,以數(shù)組的形式返回
this.values = function() {
let values = [];
for(let i=0, keys = Object.keys(items); i < keys.length; i++) {
values.push(items[keys[i]]);
}
return values;
};
this.valuesLegacy = function() {
let values = [];
for(let key in items) {
// 遍歷items對(duì)象的所有屬性
if(items.hasOwnProperty(key)) {
values.push(item[key]);
}
}
return values;
};
使用
Set類
let set = new Set(0;
set.add(1);
console.log(set.values()); // 數(shù)組類型
console.log(set.has(1)); // true
console.log(set.size()); // 1
...
集合操作
給定的兩個(gè)集合
并集,返回一個(gè)包含兩個(gè)集合中所有元素的新集合 交集,返回一個(gè)包含兩個(gè)集合中共有元素的新集合 差集,返回一個(gè)包含所有存在于第一個(gè)集合且不存在于第二個(gè)集合的元素的新集合 子集,驗(yàn)證一個(gè)給定集合是否是另一集合的子集
并集

this.union = function(otherSet) {
// 需要?jiǎng)?chuàng)建一個(gè)新的集合,代表兩個(gè)集合的并集
let unionSet = new Set();
// 獲取第一個(gè)集合所有的值,遍歷并全部添加到代表并集的集合中
let values = this.values();
for(let i=0; i<values.length; i++) {
unionSet.add(values[i]);
}
values = otherSet.values();
// 第二個(gè)集合做同樣的事
for(let i=0; i<values.length; i++) {
unionSet.add(values[i]);
}
return unionSet;
}
交集

this.intersection = function(otherSet) {
// 創(chuàng)建一個(gè)新的Set實(shí)例,這樣就能用它返回共有的元素
let intersectionSet = new Set();
let values = this.vlues();
// 遍歷當(dāng)前Set實(shí)例所有的值
for (let i=0; i<values.length; i++) {
if(otherSet.has(values[i])){
intersectionSet.add(values[i]);
}
}
return intersectionSet;
}
差集

表示A-B,x元素存在于A中,且x不存在于B中。
this.difference = function(otherSet){
// 得到所有同時(shí)存在于兩個(gè)集合中的值
let differenceSet = new Set();
let values = this.values();
//
for(let i=0; i<values.length; i++){
//
if(!otherSet.has(values[i])){
// 會(huì)得到所有存在于集合A但不存在于B的值
differenceSet.add(values[i]);
}
}
return differenceSet
};
子集
集合A是集合B的子集:

this.subset = function(otherSet){
if (this.size() > otherSet.size()){
//需要驗(yàn)證的是當(dāng)前Set實(shí)例的大小
return false;
// 如果當(dāng)前實(shí)例中的元素比otherSet實(shí)例更多,它就不是一個(gè)子集
} else {
let values = this.values();
for (let i=0; i<values.length; i++){
//要遍歷集合中的所有元素
if (!otherSet.has(values[i])){
//驗(yàn)證這些元素也存在于otherSet中
return false;
//如果有任何元素不存在于otherSet中,就意味著它不是一個(gè)子集,返回false
}
}
return true;
//如果所有元素都存在于otherSet中,那么就返回true
}
};
Set類
let set = new Set();
set.add(1);
// ES6的Set的values方法返回Iterator
// 而不是值構(gòu)成的數(shù)組
console.log(set.values()); // 輸出@Iterator
console.log(set.has(1)); // 輸出true
console.log(set.size); // 輸出1
ES6 Set類
let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
let setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
并集
let unionAb = new Set();
//創(chuàng)建一個(gè)新的集合,用來(lái)添加兩個(gè)集合中所有的元素
//迭代這兩個(gè)集合
for (let x of setA) unionAb.add(x);
for (let x of setB) unionAb.add(x);
交集
// 創(chuàng)建一個(gè)輔助函數(shù)
// 來(lái)生成包含setA和setB都有的元素的新集合
let intersection = function(setA, setB) {
let intersectionSet = new Set();
for (let x of setA) {
if (setB.has(x)) {
intersectionSet.add(x);
}
}
return intersectionSet;
};
let intersectionAB = intersection(setA, setB);
簡(jiǎn)單語(yǔ)法:
intersectionAb = new Set([x for (x of setA) if (setB.has(x))]);
差集
let difference = function(setA, setB) {
let differenceSet = new Set();
for (let x of setA) {
if (!setB.has(x)) {
// 差集中只添加setA有而setB沒有的元素
differenceSet.add(x);
}
}
return differenceSet;
};
let differenceAB = difference(setA, setB);
簡(jiǎn)單語(yǔ)法:
differenceAB = new Set([x for (x of setA) if (!setB.has(x))]);
總結(jié):JavaScript的數(shù)據(jù)結(jié)構(gòu)-集合
回看筆者往期高贊文章,也許能收獲更多喔!
一個(gè)合格的初級(jí)前端工程師需要掌握的模塊筆記 Vue.js筆試題解決業(yè)務(wù)中常見問題 【初級(jí)】個(gè)人分享Vue前端開發(fā)教程筆記 長(zhǎng)篇總結(jié)之JavaScript,鞏固前端基礎(chǔ) 前端面試必備ES6全方位總結(jié) 達(dá)達(dá)前端個(gè)人web分享92道JavaScript面試題附加回答 【圖文并茂,點(diǎn)贊收藏哦!】重學(xué)鞏固你的Vuejs知識(shí)體系 【思維導(dǎo)圖】前端開發(fā)-鞏固你的JavaScript知識(shí)體系 14期-連肝7個(gè)晚上,總結(jié)了計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)點(diǎn)?。ü?6條) 這是我的第一次JavaScript初級(jí)技巧 localStorage和sessionStorage本地存儲(chǔ) HTML5中的拖放功能 挑戰(zhàn)前端知識(shí)點(diǎn)HTTP/ECMAScript 必學(xué)必會(huì)-音頻和視頻 前端170面試題+答案學(xué)習(xí)整理(良心制作) 前端HTML5面試官和應(yīng)試者一問一答 哪吒鬧海,席卷圖文學(xué)習(xí)前端Flex布局 騰訊位置服務(wù)開發(fā)應(yīng)用 【進(jìn)階】面試官問我Chrome瀏覽器的渲染原理(6000字長(zhǎng)文) 面試官一上來(lái)就問我Chrome底層原理和HTTP協(xié)議(萬(wàn)字長(zhǎng)文) 熬夜總結(jié)了 “HTML5畫布” 的知識(shí)點(diǎn) this/call/apply/bind(萬(wàn)字長(zhǎng)文) HTTP/HTTPS/HTTP2/DNS/TCP/經(jīng)典題 執(zhí)行上下文/作用域鏈/閉包/一等公民 Web頁(yè)面制作基礎(chǔ) 學(xué)習(xí)總結(jié)之HTML5劍指前端(建議收藏,圖文并茂)
??關(guān)注+點(diǎn)贊+收藏+評(píng)論+轉(zhuǎn)發(fā)??,原創(chuàng)不易,鼓勵(lì)筆者創(chuàng)作更好的文章
點(diǎn)贊、收藏和評(píng)論
我是Jeskson(達(dá)達(dá)前端),感謝各位人才的:點(diǎn)贊、收藏和評(píng)論,我們下期見!(如本文內(nèi)容有地方講解有誤,歡迎指出?謝謝,一起學(xué)習(xí)了)
我們下期見!
文章持續(xù)更新,可以微信搜一搜「 程序員哆啦A夢(mèng) 」第一時(shí)間閱讀,回復(fù)【資料】有我準(zhǔn)備的一線大廠資料,本文 http://www.dadaqianduan.cn/#/ 已經(jīng)收錄
github收錄,歡迎Star:https://github.com/webVueBlog/WebFamily
