<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      數組去重的幾種姿勢

      上篇文章說到了引導式訪問組件,其中有個擴展功能是是否強制以及是否第一次進行引導訪問,這時候有個 guideKey 可以作為根據判斷,那么存儲拿取的時候就用到唯一值了,然后就有了這篇文章介紹的幾種姿勢,有深入哦~


      背景

      假設已經使用 guideKeyList 來記錄已完成的引導步驟:

      let guideKeyList = uni.getStorageSync("guideKeyList") || [];
      guideKeyList.push(this.guideKey);
      guideKeyList = guideKeyList.unique(); // 自定義 unique 方法
      uni.setStorageSync("guideKeyList", guideKeyList);
      

      姿勢一:原始寫法(for 循環 + includes)

      Array.prototype.unique = function () {
        let arr = [];
        for (let i = 0; i < this.length; i++) {
          if (!arr.includes(this[i])) {
            arr.push(this[i]);
          }
        }
        return arr;
      };
      

      優點:直觀、好理解。
      缺點:性能差(includes() 是 O(n))、代碼冗長。


      姿勢二:原型擴展優化(使用 Object.create(null)

      Array.prototype.unique = function () {
        const seen = Object.create(null);
        const result = [];
      
        for (let i = 0; i < this.length; i++) {
          const item = this[i];
          if (!seen[item + typeof item]) {
            seen[item + typeof item] = true;
            result.push(item);
          }
        }
      
        return result;
      };
      

      優點:性能比 includes() 更優,避免 key 沖突。
      缺點:污染 Array.prototype,多人協作項目慎用。

      建議在文檔中說明使用原型擴展的地方,防止沖突。


      姿勢三:推薦方式(使用 Set 封裝函數)

      function uniqueArray(arr) {
        return [...new Set(arr)];
      }
      

      優點:性能優秀,語義簡潔,無副作用
      缺點:IE 不支持 Set(已不再重要)。

      如果不想污染原型鏈,這是最推薦的方式。


      姿勢四:filter + indexOf

      function uniqueArray(arr) {
        return arr.filter((v, i, a) => a.indexOf(v) === i);
      }
      

      優點:不污染原型,兼容性好。
      缺點:性能比 Set 略差,代碼略冗余。


      最終整合

      在引導結束下使用:

      finish() {
        // 可以單獨拎出來在 main.ts or App.vue 等直接先實現一波,比較好看點,容易維護
        Array.prototype.unique = function () {
          const seen = Object.create(null);
          const result = [];
      
          for (let i = 0; i < this.length; i++) {
            const item = this[i];
            if (!seen[item + typeof item]) {
              seen[item + typeof item] = true;
              result.push(item);
            }
          }
          return result;
        };
      
        this.visible = false
        let guideKeyList = uni.getStorageSync('guideKeyList') || []
        guideKeyList.push(this.guideKey)
        guideKeyList = guideKeyList.unique() // 也可以替換為 Array.from(new Set(...))
        uni.setStorageSync('guideKeyList', guideKeyList)
        this.$emit('finish')
      }
      

      總結

      方法 是否污染原型 性能 可讀性 兼容性
      for + includes ? 是 ? 差 ? 簡單 ? 高
      Object.create ? 是 ? 中 ? 清晰 ? 高
      Set ? 否 ? 高 ? 極簡 ? 舊 IE 不支持
      filter+indexOf ? 否 ? 中 ? 普通 ? 高

      如果是項目封裝庫或者多人協作,避免擴展原型鏈,推薦使用函數封裝(如 uniqueArray(arr))。


      拓展姿勢:對象數組去重 & 深度去重

      對象數組去重(根據 id 去重):

      function uniqueByKey(arr, key) {
        const seen = new Set();
        return arr.filter((item) => {
          const val = item[key];
          if (seen.has(val)) return false;
          seen.add(val);
          return true;
        });
      }
      
      // 示例
      const arr = [
        { id: 1, name: "A" },
        { id: 2, name: "B" },
        { id: 1, name: "C" },
      ];
      
      console.log(uniqueByKey(arr, "id"));
      // => [ { id: 1, name: 'A' }, { id: 2, name: 'B' } ]
      

      深度去重(針對嵌套對象結構):

      function deepUnique(arr) {
        const seen = new Set();
        return arr.filter((item) => {
          const str = JSON.stringify(item);
          if (seen.has(str)) return false;
          seen.add(str);
          return true;
        });
      }
      
      // 示例:
      const nestedArr = [
        { id: 1, data: { x: 1 } },
        { id: 2, data: { x: 2 } },
        { id: 1, data: { x: 1 } },
      ];
      
      console.log(deepUnique(nestedArr));
      

      注意:deepUnique 的比較是基于 JSON 字符串的淺層一致性,不適用于包含函數或 undefined 的復雜對象。


      更進一步由大佬們來把姿勢實現下吧:

      • 實現可配置的 unique(arr, { deep: true, key: 'id' }) 工具函數
      • 集成 lodash 或 Ramda 實現更強大的數據操作鏈

      歡迎評論區繼續探討!

      posted @ 2025-07-14 10:42  幼兒園技術家  閱讀(510)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产免费无遮挡吸奶头视频| 国产狂喷潮在线观看| 人妻出轨av中文字幕| 日韩精品国产中文字幕| b站永久免费看片大全| 蜜臀久久99精品久久久久久| 国产精品免费看久久久| 无码伊人久久大杳蕉中文无码| 国产极品尤物粉嫩在线观看| FC2免费人成在线视频| 四虎国产精品永久在线| 日本久久久久亚洲中字幕| 开心五月深深爱天天天操| 日韩国产欧美精品在线| 日韩在线不卡免费视频一区| 国产精品久久久国产盗摄| 特级毛片a片久久久久久| 人妻少妇精品视频专区| av在线中文字幕不卡电影网| 国产精品一区二区三区黄色| www久久只有这里有精品| 中国女人熟毛茸茸A毛片| 日韩av一区二区精品不卡| 欧美日韩视频综合一区无弹窗| 正在播放肥臀熟妇在线视频| 国产av永久无码天堂影院| 北岛玲亚洲一区二区三区| 亚洲人成网站在线播放2019| 欧美白妞大战非洲大炮| 狠狠色噜噜狠狠狠888米奇视频| 日本无遮挡吸乳视频| 日韩一区二区三区在线视频| 一区二区中文字幕av| 亚洲AV熟妇在线观看| 国产精品中文字幕第一区| 日韩av一区二区三区不卡| 国产午夜精品福利免费看| 中文字幕av国产精品| 久久精品国产99国产精品严洲| 国产男女黄视频在线观看| 精品无码三级在线观看视频|