当前位置:首页 > 科技  > 软件

前端面试:你以为这只是一个简单的数组去重吗?

来源: 责编: 时间:2024-04-10 08:36:31 123观看
导读前言之前面试过程被问到数组去重有哪些方式?心想这个问题我会,随便也能说出好几种,也不带多思考的。巴拉巴拉巴拉巴拉。说完,面试官好像不太满意的样子,还问了句,没了吗。我想,咋滴,就这些还不不够用吗。然后就下一题了。后来

前言

之前面试过程被问到数组去重有哪些方式?心想这个问题我会,随便也能说出好几种,也不带多思考的。巴拉巴拉巴拉巴拉。说完,面试官好像不太满意的样子,还问了句,没了吗。我想,咋滴,就这些还不不够用吗。然后就下一题了。2L528资讯网——每日最新资讯28at.com

后来我看到这样的数据,忽然意识到,之前的面试怕不是草率了,完全没考虑复杂数据结构,难怪他听完不太满意的样子。2L528资讯网——每日最新资讯28at.com

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

在平时的开发过程中这样的数据应该少见,绝大部分的数组中数据格式应该保持一致,特殊情况就不管他了。2L528资讯网——每日最新资讯28at.com

今天再来出一期数组去重的方式。2L528资讯网——每日最新资讯28at.com

基本数据类型去重

确实有多种方式,比如set结构转一下,lodash提供的uniq方法,或者自己利用其他方式实现也是很多的。今天就介绍几个2L528资讯网——每日最新资讯28at.com

当面试官询问数组去重时,可以考虑到数组可能包含基本数据类型、引用数据类型,或者混合了两种类型的情况。以下是针对不同情况的多种思路和实现方法:2L528资讯网——每日最新资讯28at.com

使用 Set 数据结构(ES6)2L528资讯网——每日最新资讯28at.com

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()2L528资讯网——每日最新资讯28at.com

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()2L528资讯网——每日最新资讯28at.com

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()2L528资讯网——每日最新资讯28at.com

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 实现数组去重的方法:2L528资讯网——每日最新资讯28at.com

使用 _.uniq() 方法2L528资讯网——每日最新资讯28at.com

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() 方法(使用自定义比较函数)2L528资讯网——每日最新资讯28at.com

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 数据结构,利用自定义比较函数(如果需要去重对象数组)2L528资讯网——每日最新资讯28at.com

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()2L528资讯网——每日最新资讯28at.com

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就不等了。所以还是自己实现一个方法好一些。2L528资讯网——每日最新资讯28at.com

使用自定义比较函数

这种方法适用于任何类型的数组,包括混合了基本数据类型和引用数据类型的数组。2L528资讯网——每日最新资讯28at.com

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 数据结构的特性,用键来存储数组中的元素,保证了元素的唯一性。对于对象,通过将属性名排序并拼接成字符串来判断是否重复。2L528资讯网——每日最新资讯28at.com

如果都是引用结构,我们平时也可以使用 _.uniqBy() 方法去重,比如根据id什么的2L528资讯网——每日最新资讯28at.com

const _ = require('lodash');const array = [{id: 1}, {id: 2}, {id: 1}];const uniqueArray = _.uniqBy(array, JSON.stringify);console.log(uniqueArray); // [{id: 1}, {id: 2}]

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-82509-0.html前端面试:你以为这只是一个简单的数组去重吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java并发编程实战:信号量Semaphore的使用技巧与示例

下一篇: 探索React 19:四个实用新钩子功能

标签:
  • 热门焦点
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 这款新兴工具平台,让你的电脑效率翻倍

    这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 自律,给不了Keep自由!

    自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • ESG的面子与里子

    ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
Top
Baidu
map