題目:
求交集
寫一個函式,join,兩個整數陣列(其中元素不重複), 求其交集
join([1,2,3,5], [2,3,6,8]) // [2,3]
複製程式碼
我的第一次答案
function join(A, B) {
let result = [];
A.forEach(a => {
B.forEach(b => {
if(a === b) {
result.push(a);
}
});
});
return result;
}
複製程式碼
別人的答案
function join(A, B) {
const s = new Set(A)
return B.filter(x => s.has(x))
}
複製程式碼
我不停的提交系統一直提示我執行超時,起初我以為系統BUG了,看了別人的答案才覺得,是我太Low了。。。我的複雜度是o(n^2)
javascript中的Set資料結構
- 類似於陣列,但成員的值都是唯一的,沒有重複的值
- 向Set加入值的時候不會發生型別轉換(類似於===,區別是在Set中NaN只能有一個,而NaN===NaN是false)
陣列去重可以這樣寫:
const set = new Set([1,2,3,4,5,5]);
console.log([...set]); // [ 1, 2, 3, 4, 5 ]
複製程式碼
Set例項的屬性和方法
- Set.prototype.constructor:建構函式,預設就是Set函式。
- Set.prototype.size:返回Set例項的成員總數。
- add(value):新增某個值,返回 Set 結構本身。
- delete(value):刪除某個值,返回一個布林值,表示刪除是否成功。
- has(value):返回一個布林值,表示該值是否為Set的成員。
- clear():清除所有成員,沒有返回值。
常用的Set遍歷方法
- keys():返回鍵名的遍歷器
- values():返回鍵值的遍歷器 // 由於Set鍵名和鍵值是同一個值和keys表現一致
- entries():返回鍵值對的遍歷器
- forEach():使用回撥函式遍歷每個成員
陣列常用方法
不會修改原資料的操作
Arrary.from
從類陣列物件或可遍歷的物件中建立一個新的陣列例項;
Arrary.of
根據一組引數建立一個新的陣列例項,支援任意引數數量和型別;
Arrary.concat
合併陣列操作,多個引數陣列重尾部插入;
Arrary.every
是否每個元素都通過every指定的函式測試;
Arrary.map
返回對陣列中每個元素執行提供的函式的結果組成的陣列;
Arrary.keys
返回陣列物件中所有鍵值迭代器;
Arrary.values
返回陣列物件中所有值的迭代器;
Arrary.entries
返回陣列物件中所有鍵值對遍歷器;
Arrary.find
返回陣列物件中第一個滿足測試函式的值,否則返回undefined;
Arrary.findIndex
返回陣列物件中第一個滿足測試函式的索引,否則返回-1;
Arrary.includes
判斷陣列中是否包含當前的值,包含返回true,不包含返回false;
Arrary.indexof
返回陣列中第一個相同的值,不存在則返回-1;
Arrary.join
返回用一個分隔符連線起陣列中所有元素的字串;
Arrary.slice
返回陣列物件開始到結束淺拷貝到一個新陣列,處理函式接受兩個引數:起始值,結束值;
Arrary.reduce
陣列中每個元素執行一個函式,引數依次為:累加器,當前元素,當前元素索引,當前陣列,返回累加結果;
Arrary.some
陣列中是否存在可以通過測試函式的元素,存在返回true,否則返回false;
Arrary.forEach
對陣列中每個元素執行提供的函式;
修改原資料操作
Arrary.pop
刪除陣列物件中最後一個值,並將刪除的值返回;
Arrary.push
在陣列物件中最後一位插入一個值;
Arrary.splice
刪除現有元素,使用自定義元素替換;
Arrary.shift
刪除陣列中第一個引數,返回該引數;
Arrary.unshift
將一個或多個元素新增陣列開頭,返回新陣列長度;
Arrary.reverse
反轉陣列元素;
Arrary.filter
過濾陣列物件中所有滿足測試函式的值;
Arrary.sort
為陣列排序,預設使用Unicode碼點排序,可指定排序函式;
tips
- indexof vs include : indexof判斷不出
NAN
,陣列中有空元素,include會認為undefined,indexof不會;include是es6的語法; - for vs map vs foreach : map返回新的陣列,foreach不會;for的效率最高,但可讀性不高,有可能與外部產生耦合。推薦使用高階方法;