JavaScript陣列的去重
阿新 • • 發佈:2022-05-07
陣列的去重在我們的日常開發中有時候會使用到,但是一般都是後端去進行資料的去重操作。
但是在面試當中我們經常會被面試官問到陣列去重的方法有哪些?那麼我們就來看看陣列的去重都有哪些可以實現的方式。
1.利用 new Set()
// 利用ES6中Set建構函式生成Set資料結構,然後利用Array.from()方法進行轉換(比較常用且方便) function unique (arr) { return Array.from(new Set(arr)) // return [...new Set(arr)] 同樣可行,只是簡化了程式碼 } const arr1 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}]; console.log(unique(arr1)) // [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {…}, {…}]
注意:不考慮相容性的情況下,這種程式碼是最少的,但是這種方法不能夠去除空物件{...},需要使用高階方法。
2.利用 Array.sort()
// 利用sort進行排序方法,根據排序後的結果進行遍歷及相鄰元素對比 function unique (arr) { if (!Array.isArray(arr)) { return } arr = arr.sort() console.log(JSON.stringify(arr), 'arr---------') // [0,0,1,1,15,15,null,null,"NaN",{},{},"a","a",false,false,null,null,"true","true",true,true,null,null] const array = [arr[0]] console.log(JSON.stringify(array), 'array-----') // [0] for (let i = 1; i < arr.length; i++) { if (arr[i] !== arr[i - 1]) { array.push(arr[i]) } } return array } const arr1 = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}] console.log(unique(arr1), 'unique--------------') // [0, 1, 15, NaN, NaN, 'NaN', {…}, {…}, 'a', false, null, 'true', true, undefined]
注意:沒有去除NaN和空物件{...}
3.利用 Array.splice()
// 利用for迴圈巢狀,然後splice去重 function unique (arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] == arr[j]) { //第一個等同於第二個,splice方法刪除第二個 arr.splice(j, 1); j--; } } } return arr; } let arr1 = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}] console.log(unique(arr1)) // [1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
注意:NaN和{}沒有去重,兩個null直接消失了
4.利用 Array.indexof()
// 利用陣列indexof方法查詢該元素是否存在
function unique(arr) {
if (!Array.isArray(arr)) {
return
}
let array = []
for (let i = 0; i < arr.length; i++) {
if (array.indexOf(arr[i]) === -1) {
array.push(arr[i])
}
}
return array
}
var arr1 = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]
console.log(unique(arr1))
// [1, 'true', true, 15, false, undefined, null, NaN, NaN, 'NaN', 0, 'a', {…}, {…}]
注意:沒有去除NaN和空物件{...}
你們會發現上面的這些方法中都是可以簡單去重,但是無法去除空物件和NaN,不夠嚴格的情況下可行,但是嚴格情況下的話就需要用到hasOwnProperty()
5.利用 hasOwnProperty()
function unique(arr) {
if (!Array.isArray(arr)) {
return
}
const obj = {}
return arr.filter((item,index,arr) => {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
const arr1 = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]
console.log(unique(arr1))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {…}]
這個方法可以所有都去重,其實還有很多方法可以進行簡單的去重,具體要看嚴格性。