国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS數(shù)組專題2?? ? 數(shù)組去重

tunny / 3450人閱讀

距離上次發(fā)文,已經(jīng)有一段時(shí)間了,最近工作比較忙,這不眼看快雙十一了,就相當(dāng)于給大家一些福利吧!

一、什么是數(shù)組去重

簡(jiǎn)單說(shuō)就是把數(shù)組中重復(fù)的項(xiàng)刪除掉,你 GET 到了嗎 ?下面我將簡(jiǎn)單介紹下幾種基本的方法及其優(yōu)缺點(diǎn)。

二、方法匯總

兩層循環(huán)

無(wú)相同值直接 push 進(jìn)新數(shù)組,有相同的值則直接跳過(guò)本次內(nèi)部循環(huán)

/*
 * @param {Array} arr    -要去重的數(shù)組
 * @param {Array} result -初始化結(jié)果數(shù)組
 */
const unique = (arr, result = []) => {
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        // 相等則直接跳過(guò)
        j = ++i;
      }
    }
    result.push(arr[i]);
  }
  return result;
}

相同的做標(biāo)記,與新數(shù)組作比較,沒有則插入

/*
 * @param {Array} arr    -要去重的數(shù)組
 * @param {Array} result -初始化結(jié)果數(shù)組
 */
const unique = (arr, result = []) => {
  result.push(arr[0]);
  const len = arr.length;
  let rLen = result.length;

  for (let i = 1; i < len; i++) {
    let flag = false;
    for (var j = 0; j < rLen; j++) {
      if (arr[i] === result[j]) {
        flag = true;
        break;
      }
    }
    if (!flag) {
      rLen++;
      result.push(arr[i]);
    }
  }
  return result;
}

原地算法(在數(shù)組本身操作)

const unique = arr => {
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j,1);
        len--;
        j--;
      }
    }
  }
  return arr;
};
看似代碼代碼簡(jiǎn)單,實(shí)則內(nèi)存占用高,不實(shí)用

單層循環(huán)

對(duì)象鍵不能重復(fù)

const unique = (arr, result = []) => {
  const obj = {};
  const len = arr.length;
  for (let i = 0; i< len; i++) {
    if (!obj[arr[i]]) {
      // 鍵沒有,則添加
      obj[arr[i]] = 1;
      result.push(arr[i]);
    }
  }
  return result;
};

這種方法無(wú)法判斷 "1"1 等類型,解決方案:

添加判斷數(shù)據(jù)類型,比如 typeofobj[typeof arr[i] + arr[i]] 不過(guò)這還是判斷不了 ["1"][1],因?yàn)檫@被相加后,結(jié)果都一樣

添加 JSON.stringify() 對(duì)結(jié)果進(jìn)行去格式化,這時(shí)就可以判斷了

排序后比較前后兩位,不相等則添加進(jìn)新數(shù)組

const unique = (arr, result = []) => {
  arr.sort();
  result.push(arr[0]);
  const len = arr.length;
  let rLen = result.length;
  for (let i = 1; i < len; i++) {
    if (arr[i] !== result[rLen - 1]) {
      result.push(arr[i]);
      rLen++;
    }
  }
  return result;
}
方法比較直接

原地算法(排序后比較前后兩位,相等則刪除)

const unique = (arr) => {
  arr.sort();
  let len = arr.length;
  for (let i = 1; i < len; i++) {
    if (arr[i] === arr[i - 1]) {
      arr.splice(i, 1)
      len--;
    }
  }
  return arr;
}
不消耗額外的空間

偷懶的節(jié)奏

indexOf 判斷數(shù)組元素第一次出現(xiàn)的位置是否相同

const unique = (arr, result) => {
  arr.forEach((item, index, array) => {
    if(array.indexOf(item) === index) {
      result.push(item);
    }
  });
  return result;
}

// 使用ES6 filter
const unique = (arr) =>
  arr.filter((item, index) =>  array.indexOf(item) === index);
使用ES6 方法更簡(jiǎn)潔性能更好

indexOf 的ES6 方法通過(guò) includes 判斷新數(shù)組中是否有該元素

const unique = (arr, result) => {
  arr.forEach((item, index, array) => {
    if(!result.includes(item)) {
      // 或者 result.indexOf(item) === -1
      result.push(item);
    }
  });
  return result;
}
建議使用 includes

Map 數(shù)據(jù)結(jié)構(gòu),不懂 Map 的自行解決,傳送門

const unique = arr => {
  const map = new Map();
  return arr.filter((item) => !map.has(item) && map.set(item, 1));
}
對(duì)象關(guān)系映射可以設(shè)置不同類型的鍵,使之很快能收集 arr 中不一樣的數(shù)據(jù)

Set 數(shù)據(jù)結(jié)構(gòu),不允許出現(xiàn)重復(fù)數(shù)據(jù),而且 Set 支持解構(gòu) 傳送門

const unique = arr => Array.from(new Set(arr));

// 或者通過(guò) ES6 的 ...解構(gòu)
const unique = arr => [...new Set(arr)];
簡(jiǎn)單粗暴

reduce,給定初始值,根據(jù)數(shù)組循環(huán)給出最終值

const unique = (arr, result = []) => arr.reduce((prev,curr) => prev.includes(curr) ? prev : [...prev, curr], result);
三、總結(jié)

方法已經(jīng)說(shuō)了差不多了,就看你怎么用了,其中有一些差不多的方法,只是給了說(shuō)明,沒給具體的例子,希望大家自己去試一下,告辭!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/98017.html

相關(guān)文章

  • JS數(shù)組專題1?? ? 數(shù)組扁平化

    一、什么是數(shù)組扁平化 扁平化,顧名思義就是減少?gòu)?fù)雜性裝飾,使其事物本身更簡(jiǎn)潔、簡(jiǎn)單,突出主題。 數(shù)組扁平化,對(duì)著上面意思套也知道了,就是將一個(gè)復(fù)雜的嵌套多層的數(shù)組,一層一層的轉(zhuǎn)化為層級(jí)較少或者只有一層的數(shù)組。 Ps: flatten 可以使數(shù)組扁平化,效果就會(huì)如下: const arr = [1, [2, [3, 4]]]; console.log(flatten(arr)); // [1, ...

    lieeps 評(píng)論0 收藏0
  • ?每日肥學(xué)?——算法&amp;面試題3??

    每日肥學(xué) 導(dǎo)讀?算法題一點(diǎn)點(diǎn)思路源碼和解析 ?面試題特別介紹 導(dǎo)讀 小伙伴們新的學(xué)期又要開始了,您是否已經(jīng)做好了沖刺的準(zhǔn)備了呢?如果您想在這個(gè)學(xué)期收獲的比別人更多我建議給肥肥點(diǎn)個(gè)關(guān)注。我們一起來(lái)增長(zhǎng)知識(shí),無(wú)論你是考研還是找工作或者是要加薪。這里都是一個(gè)不錯(cuò)的選擇。讓我們紅塵作伴,一起肥學(xué)!!! ?算法題 實(shí)現(xiàn)獲取 下一個(gè)排列 的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個(gè)更大的排列...

    biaoxiaoduan 評(píng)論0 收藏0
  • JavaScript數(shù)組函數(shù)

    摘要:如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之間的項(xiàng),但不包括結(jié)束位置的項(xiàng)。刪除刪除任意數(shù)量的項(xiàng),只需指定兩個(gè)參數(shù)要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。例如會(huì)刪除數(shù)組中的前兩項(xiàng)。和這兩個(gè)方法都接收兩個(gè)參數(shù)要查找的項(xiàng)和可選的表示查找起點(diǎn)位置的索引。 下面總結(jié)了一些JavaScript中常用的數(shù)組操作方法。驗(yàn)證是不是數(shù)組用 arr instanceof Array 或者Array.isArray...

    notebin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<