陣列去重我們不但會在平時的開發中用到,就是面試也是高頻出現的一道題,面試官的目的主要是想了解我們對基礎知識的掌握以及是否能用更優雅的方法去實現。
陣列去重
以下幾種方法均採用
const arr = [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10]
- 雙迴圈去重 主要思想就是定義一個新陣列,存放原陣列的第一個元素,然後將原陣列--和新陣列的元素對比,若不同則存放在新陣列裡
function unique(arr) {
let arr1 = [arr[0]]
for(let i = 0; i < arr.length; i++ ) {
let flag = true
for(let j = 0; j < arr1.length; j++) {
if (arr[i] === arr1[j]) {
flag = false;
break
}
}
if (flag) {
arr1.push(arr[i])
}
}
return arr1
}
- indexOf去重1 主要思想:建立一個新陣列並判斷元素是否已經在新陣列出現過,沒有則新增到新陣列
function unique(arr) {
let arr1 = []
for (let i = 0; i < arr.length; i++) {
if (arr1.indexOf(arr[i]) === -1 ) {
arr1.push(arr[i])
}
}
return arr1
}
- indexOf 去重2 通過過濾返回元素第一次出現的位置與原下標相等所組成的新陣列
function unique(arr) {
let arr1 = []
return arr.filter((item, index) => {
return arr.indexOf(item) === index
})
}
- 相鄰元素去重 將原陣列排序然後相鄰元素進行比對,如果不相同就新增到新陣列
function unique(arr) {
arr.sort()
let arr1 = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
arr1.push(arr[i])
}
}
return res
}
- 利用物件屬性存在的特性,如果沒有該屬性則存入新陣列
function unique(arr) {
let obj = {}
let arr1 = []
for(let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
obj[arr[i]] = true
arr1.push(arr[i])
}
}
return arr1
}
- 利用陣列原型物件上的includes方法。建立一個新陣列並判斷是否包含原陣列的元素,不包含則新增到新陣列
function unique(arr) {
let arr1 = []
for(let i = 0; i < arr.length; i++) {
if (!arr1.includes(arr[i])) {
arr1.push(arr[i])
}
}
return arr1
}
- 利用陣列原型物件上的 splice 方法。
function unique(arr) {
let length = arr.length;
for (let i = 0; i < length; i++) {
for (j = i + 1; j < length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
length--;
j--;
}
}
}
return arr;
}
- 利用陣列原型物件上的 lastIndexOf 方法。與上面第二種方法思想一致
function unique(arr) {
let arr1 = []
for(let i = 0; i< arr.length; i++) {
if (arr1.lastIndexOf(arr[i]) === -1) {
arr1.push(arr[i])
}
}
return arr1
}
- 利用 ES6的set方法。
function unique(arr) {
//Set資料結構,它類似於陣列,其成員的值都是唯一的
return Array.from(new Set(arr)); // 利用Array.from將Set結構轉換成陣列
// 或者
// return [...new Set(arr)]
}
陣列扁平化
將二維甚至多維陣列變成一維陣列
const arr = [1,2,[3,4,[5,6],7],8]
- flat(Infinity)
let arr1 = arr.flat(Infinity)
- for迴圈遞迴
const arr2 = []
function arr1(arr) {
for(let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
arr1(arr[i])
}else{
arr2.push(arr[i])
}
}
}
arr1(arr)
- reduce
function arrFlat(arr) {
return arr.reduce((pre,cur) => {
return pre.concat(Array.isArray(cur) ? arrFlat(cur) : cur)
}, [])
}
console.log(arrFlat(arr))