成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端面試:你以為這只是一個簡單的數組去重嗎?

開發 前端
確實有多種方式,比如set結構轉一下,lodash提供的uniq方法,或者自己利用其他方式實現也是很多的。今天就介紹幾個。

前言

之前面試過程被問到數組去重有哪些方式?心想這個問題我會,隨便也能說出好幾種,也不帶多思考的。巴拉巴拉巴拉巴拉。說完,面試官好像不太滿意的樣子,還問了句,沒了嗎。我想,咋滴,就這些還不不夠用嗎。然后就下一題了。

后來我看到這樣的數據,忽然意識到,之前的面試怕不是草率了,完全沒考慮復雜數據結構,難怪他聽完不太滿意的樣子。

let arr = [1, 1, '2', 3, 1, 2,
    { name: '張三', id: { n: 1 }},
    { name: '張三', id: { n: 1 }},
    { name: '張三', id: { n: 2 }}
]

在平時的開發過程中這樣的數據應該少見,絕大部分的數組中數據格式應該保持一致,特殊情況就不管他了。

今天再來出一期數組去重的方式。

基本數據類型去重

確實有多種方式,比如set結構轉一下,lodash提供的uniq方法,或者自己利用其他方式實現也是很多的。今天就介紹幾個

當面試官詢問數組去重時,可以考慮到數組可能包含基本數據類型、引用數據類型,或者混合了兩種類型的情況。以下是針對不同情況的多種思路和實現方法:

使用 Set 數據結構(ES6)

const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]

使用 Array.prototype.filter()

const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

使用 Array.prototype.reduce()

const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = array.reduce((acc, curr) => {
    if (!acc.includes(curr)) {
        acc.push(curr);
    }
    return acc;
}, []);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

使用 for 循環和 Array.prototype.indexOf()

const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = [];
for (let i = 0; i < array.length; i++) {
    if (uniqueArray.indexOf(array[i]) === -1) {
        uniqueArray.push(array[i]);
    }
}
console.log(uniqueArray); // [1, 2, 3, 4, 5]

Lodash 是一個非常流行的 JavaScript 工具庫,提供了許多實用的函數來簡化開發過程。它也包含了一些用于數組去重的方法。以下是幾種利用 Lodash 實現數組去重的方法:

使用 _.uniq() 方法

const _ = require('lodash');


const array = [1, 2, 3, 3, 4, 5, 5];
const uniqueArray = _.uniq(array);
console.log(uniqueArray); // [1, 2, 3, 4, 5]

使用 _.uniqWith() 方法(使用自定義比較函數)

const _ = require('lodash');


const array = [{id: 1}, {id: 2}, {id: 1}];
const uniqueArray = _.uniqWith(array, (a, b) => _.isEqual(a, b));
console.log(uniqueArray); // [{id: 1}, {id: 2}]

2. 數組包含引用數據類型:

使用 Set 數據結構,利用自定義比較函數(如果需要去重對象數組)

const array = [{id: 1}, {id: 2}, {id: 1}];
const uniqueArray = Array.from(new Set(array.map(JSON.stringify)), JSON.parse);
console.log(uniqueArray); // [{id: 1}, {id: 2}]

使用 Array.prototype.reduce()

const array = [{id: 1}, {id: 2}, {id: 1}];
const uniqueArray = array.reduce((acc, current) => {
    const isExist = acc.some(item => JSON.stringify(item) === JSON.stringify(current));
    if (!isExist) acc.push(current);
    return acc;
}, []);
console.log(uniqueArray); // [{id: 1}, {id: 2}]

上面都是使用了JSON.stringfy。但有個問題,如果引用數據的順序不一樣,轉的string就不等了。所以還是自己實現一個方法好一些。

使用自定義比較函數

這種方法適用于任何類型的數組,包括混合了基本數據類型和引用數據類型的數組。

function uniqueArray(array) {
    const seen = new Map();
    return array.filter(item => {
        if (typeof item === 'object' && item !== null) {
            const key = Object.keys(item).sort().map(k => `${k}:${item[k]}`).join('|');
            if (!seen.has(key)) {
                seen.set(key, true);
                return true;
            }
        } else {
            if (!seen.has(item)) {
                seen.set(item, true);
                return true;
            }
        }
        return false;
    });
}


const array = [1, 2, {id: 1}, {id: 2}, 1, {id: 1}];
const uniqueArr = uniqueArray(array);
console.log(uniqueArr); // [1, 2, {id: 1}, {id: 2}]

這個方法利用了 Map 數據結構的特性,用鍵來存儲數組中的元素,保證了元素的唯一性。對于對象,通過將屬性名排序并拼接成字符串來判斷是否重復。

如果都是引用結構,我們平時也可以使用 _.uniqBy() 方法去重,比如根據id什么的

const _ = require('lodash');


const array = [{id: 1}, {id: 2}, {id: 1}];
const uniqueArray = _.uniqBy(array, JSON.stringify);
console.log(uniqueArray); // [{id: 1}, {id: 2}]
責任編輯:武曉燕 來源: 海燕技術棧
相關推薦

2016-09-09 08:27:16

2018-08-16 21:40:05

面試簡歷技術

2019-03-29 08:46:46

4G5G網速

2022-08-19 10:27:39

系統模型

2024-11-28 10:09:06

2020-03-13 13:45:41

前端面試Web

2020-04-03 09:35:33

前端框架Vue

2013-06-05 10:32:38

GoogleAndroid Stu

2021-06-08 07:48:26

iOS 15 Linux 操作系統

2019-08-22 17:19:19

javascript去重數組

2024-01-15 00:35:23

JavaScript框架HTML

2023-06-26 08:24:23

JavaScriptAJAX

2016-10-17 10:15:45

俞永福高德日活百度

2017-09-06 09:13:24

2017-08-16 10:03:57

前端面試題算法

2021-12-31 16:16:04

JavaScript數組代碼

2023-07-11 13:34:19

Rust開發軟件

2024-05-28 10:14:31

JavaScrip模板引擎

2021-07-07 06:16:29

EmacsMeta鍵編程

2020-11-06 09:05:18

前端web開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区久久 | 亚洲毛片网站 | 超碰日本| 特黄色毛片 | 日韩欧美在线视频 | 青青草av网站 | 偷拍第一页 | 国产精品综合网 | 亚洲一区视频在线 | 国产欧美三区 | 91xxx在线观看 | 久久久免费毛片 | 亚洲v日韩v综合v精品v | 欧美日韩国产一区二区三区 | 成人av一区| 91精品国产91久久久 | 日日操夜夜操视频 | 亚洲一区久久久 | 亚洲成人免费视频 | 亚洲黄色av网站 | 国产美女黄色片 | 国产精品永久 | 欧美黄色免费网站 | 免费在线一区二区 | 日韩第一区 | 国内精品久久久久 | 91传媒在线观看 | 影音先锋久久 | 中文字幕日韩一区二区 | 玖玖综合网 | 亚洲+变态+欧美+另类+精品 | 在线视频一区二区三区 | 操操网站 | 2018中文字幕第一页 | 精品久久久久一区二区国产 | 国产精品区一区二区三 | 亚洲欧美日韩网站 | 色网在线看 | 国产精品一区二区在线 | 国产一区在线视频 | 日韩综合在线播放 |