11種JavaScript前端數(shù)據(jù)去重方式總結(jié)
1.使用 for 循環(huán)和 indexOf 方法,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
const result = []
for (let i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) === -1) {
result.push(arr[i])
}
}
return result
}2.使用 for 循環(huán)和對(duì)象,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
const result = []
const obj = {}
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
result.push(arr[i])
obj[arr[i]] = true
}
}
return result
}3.使用 filter 方法和 indexOf 方法,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
return arr.filter((item, index, arr) => arr.indexOf(item) === index)
}4.使用 filter 方法和對(duì)象,復(fù)雜度 O(n)
function uniqueArray(arr) {
const obj = {}
return arr.filter((item) => obj.hasOwnProperty(item) ? false : (obj[item] = true))
}5.使用 Set 數(shù)據(jù)結(jié)構(gòu),復(fù)雜度 O(n)
function uniqueArray(arr) {
return Array.from(new Set(arr))
}
// 使用解構(gòu) + Set
function uniqueArray(arr) {
return [...new Set(arr)]
}6.使用 Map 數(shù)據(jù)結(jié)構(gòu),復(fù)雜度 O(n)
function uniqueArray(arr) {
const map = new Map();
const result = [];
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])) {
map.set(arr[i], true);
result.push(arr[i]);
}
}
return result;
}
// or
function uniqueArray(arr) {
const map = new Map();
return arr.filter(function(item) {
return !map.has(item) && map.set(item, true);
});
}7.使用雙重循環(huán)和 splice 方法,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
return arr;
}8.使用排序和雙指針
使用排序和雙指針可以實(shí)現(xiàn) O(nlogn) 的時(shí)間復(fù)雜度。先對(duì)數(shù)組進(jìn)行排序,然后使用雙指針遍歷數(shù)組,如果左指針和右指針指向的值相同,就把右指針向右移動(dòng),直到找到不同的值,然后把左指針向右移動(dòng),繼續(xù)遍歷。
function uniqueArray(arr) {
arr.sort();
var left = 0, right = 1;
var result = [];
while (right <= arr.length) {
if (arr[left] === arr[right]) {
right++;
} else {
result.push(arr[left]);
left = right;
right++;
}
}
return result;
}9.使用 reduce 方法和 includes,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
return arr.reduce(function(prev, cur) {
if (!prev.includes(cur)) {
prev.push(cur);
}
return prev;
}, []);
}10.使用遞歸和 includes,復(fù)雜度 O(n^2)
function uniqueArray(arr) {
if (arr.length === 1) {
return arr;
} else {
const first = arr[0];
const rest = uniqueArray(arr.slice(1));
if (rest.includes(first)) {
return rest;
} else {
return [first].concat(rest);
}
}
}11.雙層循環(huán),復(fù)雜度 O(n^2)
function uniqueArray(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < result.length; j++) {
if (arr[i] === result[j]) {
break;
}
}
if (j === result.length) {
result.push(arr[i]);
}
}
return result;
}到此這篇關(guān)于11種JavaScript前端數(shù)據(jù)去重方式總結(jié)的文章就介紹到這了,更多相關(guān)JavaScript數(shù)據(jù)去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于element-ui組件手動(dòng)實(shí)現(xiàn)單選和上傳功能
在用戶使用過程中提出一鍵導(dǎo)入的功能,需求如下:點(diǎn)擊導(dǎo)入按鈕顯示提示框,然后是單選框以及上傳按鈕。這篇文章主要介紹了基于element-ui組件手動(dòng)實(shí)現(xiàn)單選和上傳功能,需要的朋友可以參考下2018-12-12
ThreeJS從創(chuàng)建場(chǎng)景到使用功能實(shí)例詳解
threejs是一個(gè)用于在瀏覽器中繪制3D圖像的JS庫(kù),它是基于webgl實(shí)現(xiàn)了,包括了webgl1和webgl2的渲染引擎,下面這篇文章主要給大家介紹了關(guān)于ThreeJS從創(chuàng)建場(chǎng)景到使用功能的相關(guān)資料,需要的朋友可以參考下2022-08-08
JavaScript中字符串和字符串拼接操作實(shí)例代碼
這篇文章主要介紹了JavaScript中字符串和字符串拼接操作的相關(guān)資料,文中通過示例代碼詳解講解了創(chuàng)建方式、不可變性及長(zhǎng)度屬性,包括+、+=、concat()、模板字符串拼接方法,需要的朋友可以參考下2025-05-05
獲取服務(wù)器傳來的數(shù)據(jù) 用JS去空格的正則表達(dá)式
獲取服務(wù)器傳來的數(shù)據(jù) 用JS去空格的正則表達(dá)式,需要的朋友可以參考下2012-03-03
JS實(shí)現(xiàn)盒子跟著鼠標(biāo)移動(dòng)及鍵盤方向鍵控制盒子移動(dòng)效果示例
這篇文章主要介紹了JS實(shí)現(xiàn)盒子跟著鼠標(biāo)移動(dòng)及鍵盤方向鍵控制盒子移動(dòng)效果,涉及javascript事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-01-01
js實(shí)現(xiàn)顏色階梯漸變效果(Gradient算法)
在色彩中,色相、明度、純度也都可以產(chǎn)生漸變效果,并會(huì)表現(xiàn)出具有豐富層次的美感。本文主要講述兩種顏色RGB數(shù)值的梯級(jí)漸變算法。下面跟著小編一起來看下吧2017-03-03

