數(shù)組去重
-
for
循環(huán)+indexOf
function unique(arr) { let uniqueArr = [] const len = arr.length for (let i = 0; i < len; i++) { if (uniqueArr.indexOf(arr[i]) == -1) { uniqueArr.push(arr[i]) } } return uniqueArr } const arr = [1,2,1,3,'1',2,3,4] const result = unique(arr) console.log(result) // [ 1, 2, 3, '1', 4 ]
- 排序后去重
function unique(arr) { let uniqueArr = [] let sortArr = arr.concat().sort() let len = sortArr.length let prev for (let i = 0; i < len; i++) { if (!i || prev !== sortArr[i]) { uniqueArr.push(sortArr[i]) } prev = sortArr[i] } return uniqueArr } const arr = [1,2,1,3,'1',2,3,4] const result = unique(arr) console.log(result) // [ 1, '1', 2, 3, 4 ]
- 哈希表
function unique(arr) { let uniqueArr = [] let obj = {} const len = arr.length for (let i = 0; i < len; i++) { obj[typeof arr[i] + arr[i]] = arr[i] } for (let i in obj) { uniqueArr.push(obj[i]) } return uniqueArr } const arr = [1, 2, 1, 3, '1', 2, 3, 4] const result = unique(arr) console.log(result) // [ 1, 2, 3, '1', 4 ]
- 利用
set
結(jié)構(gòu)function unique(arr) { return Array.from(new Set(arr)) } const arr = [1, 2, 1, 3, '1', 2, 3, 4] const result = unique(arr) console.log(result) // [ 1, 2, 3, '1', 4 ]
數(shù)組扁平化
- 遍歷遞歸
function flatten(array, dep = 1) { let result = [] for(let i = 0; i < array.length; i++) { if(dep > 0) { if(Array.isArray(array[i])){ result = result.concat(flatten(array[i], dep - 1)) }else { result.push(array[i]) } }else { result.push(array[i]) } } return result } const arr = [1, [2,[3,4]],5,6] const result = flatten(arr) console.log(result) // [ 1, 2, [3, 4], 5, 6 ]
- 數(shù)組的
flat
方法
flat方法接受一個參數(shù)表示想要拉平的層數(shù),默認為1function flatten(array) { return array.flat(Infinity) } const arr = [1, [2,[3,4]],5,6] const result = flatten(arr) console.log(result) // [ 1, 2, 3, 4, 5, 6 ]
- 擴展運算符
function flatten(array, dep = 1) { while (array.some(item => Array.isArray(item)) && dep > 0) { dep-- array = [].concat(...array); } return array } const arr = [1, [2,[3,4]],5,6] const result = flatten(arr) console.log(result) // [ 1, 2, [ 3, 4 ], 5, 6 ]
- 利用
reduce
function flatten(array, dep = 1) { let result = [] if (dep > 0) { result = array.reduce((total, value)=> { return total.concat(Array.isArray(value) ? flatten(value, dep - 1) : value) }, []) } else { result = array.slice() } return result } const arr = [1, [2,[3,4]],5,6] const result = flatten(arr) console.log(result) // [ 1, 2, [ 3, 4 ], 5, 6 ]
數(shù)組的隨機排列
數(shù)組的隨機排列就像洗撲克牌一樣
function shuffle(array) {
const len = array.length
for (let i = len - 1; i > 0; i--) {
const randomIndex = Math.floor(Math.random() * (i + 1))
swap(array, i, randomIndex)
}
}
reduce
- demo
const res = [1,2,3,4,5].reduce(function (a, b, i) { return a + b; }) console.log(res) // 15 const res1 = [1,2,3,4,5].reduce(function (a, b, i) { return a + b; }, 10); console.log(res1) // 25
- 模擬實現(xiàn)
Array.prototype.reduce = function(callback, total) { const array = this if (array.length === 0 && arguments.length < 2) { throw new Error('TypeError: Reduce of empty array with no initial value') } let startIndex let result if (arguments.length >= 2) { startIndex = 0 result = total }else { startIndex = 1 result = array[0] } for (let i = startIndex; i < array.length; i++) { result = callback(result, array[i], i, array) } return result }
常用方法
- 靜態(tài)方法
-
Array.isArray()
返回一個布爾值做粤,表示參數(shù)是否為數(shù)組 -
Array.from()
用于將兩類對象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對象和可遍歷(iterable)的對象(set和map) -
Array.of()
用于將一組值怎顾,轉(zhuǎn)換為數(shù)組
-
- 改變原數(shù)組
-
push()
向數(shù)組的末尾添加一個或更多元素 -
pop()
刪除并返回數(shù)組的最后一個元素 -
unshift()
向數(shù)組的開頭添加一個或更多元素 -
shift()
刪除并返回數(shù)組的第一個元素 -
reverse()
顛倒數(shù)組中元素的順序 -
splice()
刪除原數(shù)組的一部分成員,并可以在刪除的位置添加新的數(shù)組成員 -
sort()
對數(shù)組的元素進行排序灾梦,默認是按照字典順序排序 -
fill()
fill方法使用給定值峡钓,填充一個數(shù)組
-
- 不改變原數(shù)組
-
concat()
用于多個數(shù)組的合并,返回一個新數(shù)組 -
slice()
用于提取目標數(shù)組的一部分若河,返回一個新數(shù)組 -
join()
以指定參數(shù)作為分隔符能岩,將所有數(shù)組成員連接為一個字符串返回,默認逗號分隔 -
map()
將數(shù)組的所有成員依次傳入?yún)?shù)函數(shù)萧福,然后把每一次的執(zhí)行結(jié)果組成一個新數(shù)組返回 -
forEach()
對數(shù)組的所有成員依次執(zhí)行參數(shù)函數(shù)拉鹃,不返回值 -
filter()
用于過濾數(shù)組成員,滿足條件的成員組成一個新數(shù)組返回 -
every()
所有成員的返回值都是true鲫忍,整個every方法才返回true -
some()
只要一個成員的返回值是true膏燕,則整個some方法的返回值就是true -
keys()
,values()
,entries()
用于遍歷數(shù)組,使用for of
-
reduce()
從左到右依次處理數(shù)組的每個成員悟民,最終累計為一個值 -
reduceRight()
從右到左依次處理數(shù)組的每個成員煌寇,最終累計為一個值 -
indexOf()
返回給定元素在數(shù)組中第一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-1逾雄,不能搜索NaN -
lastIndexOf()
返回給定元素在數(shù)組中最后一次出現(xiàn)的位置阀溶,如果沒有出現(xiàn)則返回-1 -
find()
用于找出第一個符合條件的數(shù)組成員,如果沒有符合條件的成員鸦泳,則返回undefined -
findIndex()
返回第一個符合條件的數(shù)組成員的位置银锻,如果所有成員都不符合條件,則返回-1 -
includes()
返回一個布爾值做鹰,表示某個數(shù)組是否包含給定的值 -
flat()
用于將嵌套的數(shù)組“拉平”击纬,變成一維的數(shù)組,該方法返回一個新數(shù)組钾麸,對原數(shù)據(jù)沒有影響
-