JS数组去重的方法
发布日期:2021-05-14 16:32:49 浏览次数:10 分类:精选文章

本文共 1952 字,大约阅读时间需要 6 分钟。

Below是优化后的内容:


利用 ES6 Set 去重

方法一:使用 Set 和 Array.from

같은值会被 Set自動去重,Array.from 可以将其轉換為陣列。

function unique(arr) {  return Array.from(new Set(arr));}

注意事項

  • Set 只能 accept Objects,轉换為集合時, Pale 難的 key 必须是 primitives(字符串或數值)。
  • 如果數值型的 key,Set 會自動進位。

方法二:遍历塔蝶-splice

先創建Pointer, 階驰遍歷,遇到重复值時刪除後面的元素。

function unique(arr) {  for (let i = 0; i < arr.length; i++) {    for (let j = i + 1; j < arr.length; j++) {      if (arr[i] === arr[j]) {        arr.splice(j, 1);        j--;      }    }  }  return arr;}

注意事項

  • splice 方法摘除元素,且 j 需要降低,否則索引會出錯。

利用 indexOf 去重

於 Penny ,建立新陣列,時間 complexity O(n²),但直觀易懂。

function unique(arr) {  if (!Array.isArray(arr)) {    console.log('輸入錯誤');    return [];  }  const result = [];  for (let i = 0; i < arr.length; i++) {    if (result.indexOf(arr[i]) === -1) {      result.push(arr[i]);    }  }  return result;}

利用 sort()

排序並移動重复元素。

function unique(arr) {  if (!Array.isArray(arr)) {    console.log('輸入錯誤');    return [];  }  const sorted = arr.slice().sort();  const result = [sorted[0]];  for (let i = 1; i < sorted.length; i++) {    if (sorted[i] !== sorted[i - 1]) {      result.push(sorted[i]);    }  }  return result;}

使用 includes 方法

直接檢查是否存在陣列已有元素, dahaเข็ง kop。

function unique(arr) {  if (!Array.isArray(arr)) {    console.log('輸入錯誤');    return [];  }  const result = [];  for (let item of arr) {    if (!result.includes(item)) {      result.push(item);    }  }  return result;}

使用 Map 去重

使用 Map 儿童儲存$arrayElem, unmap():

function unique(arr) {  const map = new Map();  const result = [];  for (let item of arr) {    if (!map.has(item)) {      map.set(item, true);      result.push(item);    }  }  return result;}

使用 filter

直接 filter 排除重复元素。

function unique(arr) {  return arr.filter((item, index, arr) => {    return arr.indexOf(item) === index;  });}

重點總結:

  • Set 創建了新集合,杜撰重複值。
  • splice 可能效率低,ray-hinge一些情況下基殆效果。
  • indexOf 是手動 implemented, cubic timing.
  • sort() 及 filter 都會 O(n log n) 时间 complexity。
  • Map 提供了更直接的方式儲存VISITOR 已經查看的元素。

上一篇:解决关于react antd Form组件不能更新state的问题
下一篇:用node实现socketIO实时通信

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月05日 21时18分30秒