当前位置: 首页 > news >正文

大白话JavaScript实现一个函数,将数组中的元素进行去重

大白话JavaScript实现一个函数,将数组中的元素进行去重

答题思路

要实现数组元素去重的函数,核心思路是遍历数组,然后判断每个元素是否已经在新数组里存在,如果不存在就添加进去,存在则跳过。下面会介绍几种不同的实现方法,每种方法都有其特点和适用场景。

  • 使用 Set 对象Set 是 ES6 引入的一种数据结构,它本身就不允许有重复的值,所以直接把数组转成 Set 再转回来就能去重。
  • 使用 indexOf 方法:通过遍历数组,利用 indexOf 方法检查元素在数组中第一次出现的位置,如果和当前位置相同,说明不重复,添加到新数组。
  • 使用 includes 方法:同样遍历数组,用 includes 方法判断新数组是否已经包含当前元素,不包含就添加。
  • 双重循环:外层循环遍历原数组,内层循环检查当前元素是否已经在新数组中出现过,没出现过就添加。

回答范文

方法一:使用 Set 对象
// 定义一个名为 uniqueArray 的函数,接收一个数组 arr 作为参数
function uniqueArray(arr) {
    // 使用 new Set(arr) 将数组 arr 转换为一个 Set 对象,Set 对象会自动去除重复元素
    // 然后使用扩展运算符 ... 将 Set 对象转换回数组
    return [...new Set(arr)];
}

// 定义一个测试数组,包含重复元素
let testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重,并将结果存储在 result 变量中
let result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);
方法二:使用 indexOf 方法
// 定义一个名为 uniqueArray 的函数,接收一个数组 arr 作为参数
function uniqueArray(arr) {
    // 创建一个空数组 newArr,用于存储去重后的元素
    let newArr = [];
    // 使用 for 循环遍历数组 arr 中的每个元素
    for (let i = 0; i < arr.length; i++) {
        // 使用 indexOf 方法检查元素 arr[i] 在新数组 newArr 中第一次出现的位置
        // 如果返回 -1,表示该元素在 newArr 中不存在
        if (newArr.indexOf(arr[i]) === -1) {
            // 将不存在的元素添加到新数组 newArr 中
            newArr.push(arr[i]);
        }
    }
    // 返回去重后的新数组
    return newArr;
}

// 定义一个测试数组,包含重复元素
let testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重,并将结果存储在 result 变量中
let result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);
方法三:使用 includes 方法
// 定义一个名为 uniqueArray 的函数,接收一个数组 arr 作为参数
function uniqueArray(arr) {
    // 创建一个空数组 newArr,用于存储去重后的元素
    let newArr = [];
    // 使用 for 循环遍历数组 arr 中的每个元素
    for (let i = 0; i < arr.length; i++) {
        // 使用 includes 方法检查新数组 newArr 是否包含元素 arr[i]
        // 如果不包含,返回 false,取反后为 true
        if (!newArr.includes(arr[i])) {
            // 将不包含的元素添加到新数组 newArr 中
            newArr.push(arr[i]);
        }
    }
    // 返回去重后的新数组
    return newArr;
}

// 定义一个测试数组,包含重复元素
let testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重,并将结果存储在 result 变量中
let result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);
方法四:双重循环
// 定义一个名为 uniqueArray 的函数,接收一个数组 arr 作为参数
function uniqueArray(arr) {
    // 创建一个空数组 newArr,用于存储去重后的元素
    let newArr = [];
    // 外层 for 循环遍历数组 arr 中的每个元素
    for (let i = 0; i < arr.length; i++) {
        // 定义一个布尔变量 isDuplicate,用于标记元素是否重复,初始值为 false
        let isDuplicate = false;
        // 内层 for 循环遍历新数组 newArr 中的每个元素
        for (let j = 0; j < newArr.length; j++) {
            // 如果当前元素 arr[i] 等于新数组 newArr 中的某个元素 newArr[j]
            if (arr[i] === newArr[j]) {
                // 将 isDuplicate 标记为 true,表示该元素重复
                isDuplicate = true;
                // 一旦发现重复,跳出内层循环
                break;
            }
        }
        // 如果 isDuplicate 为 false,说明该元素不重复
        if (!isDuplicate) {
            // 将不重复的元素添加到新数组 newArr 中
            newArr.push(arr[i]);
        }
    }
    // 返回去重后的新数组
    return newArr;
}

// 定义一个测试数组,包含重复元素
let testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重,并将结果存储在 result 变量中
let result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);

这几种方法都能实现数组去重,使用 Set 对象的方法代码最简洁,性能也较好;indexOfincludes 方法比较直观;双重循环方法逻辑简单,但性能相对较低,适合处理小规模数组。

其他方法
以下再为你介绍几种 JavaScript 实现数组去重的方法,并且会逐行添加注释。

方法一:使用 filterObject 结合

// 定义一个名为 uniqueArray 的函数,用于对数组进行去重操作
function uniqueArray(arr) {
    // 创建一个空对象 obj,用于存储已经出现过的元素
    const obj = {};
    // 使用 filter 方法过滤数组中的元素
    return arr.filter((item) => {
        // 判断对象 obj 中是否已经存在当前元素 item 作为属性
        // 如果不存在,将该元素作为属性添加到对象 obj 中,并将属性值设为 true
        // 同时返回 true,表示该元素会被保留在过滤后的数组中
        // 如果已经存在,返回 false,表示该元素会被过滤掉
        return obj.hasOwnProperty(item) ? false : (obj[item] = true);
    });
}

// 定义一个包含重复元素的测试数组
const testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重
const result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);

解释:利用 Object 的属性不能重复这一特性,通过 filter 方法遍历数组。对于每个元素,检查它是否已经作为对象的属性存在。如果不存在,就把它添加为对象的属性,同时保留该元素;如果已经存在,就过滤掉该元素。

方法二:使用 reduce 方法

// 定义一个名为 uniqueArray 的函数,接收一个数组 arr 作为参数
function uniqueArray(arr) {
    // 使用 reduce 方法对数组进行累积操作
    return arr.reduce((acc, current) => {
        // 检查累积数组 acc 中是否包含当前元素 current
        if (!acc.includes(current)) {
            // 如果不包含,将当前元素添加到累积数组中
            acc.push(current);
        }
        // 返回累积数组
        return acc;
    }, []);
}

// 定义一个包含重复元素的测试数组
const testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重
const result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);

解释reduce 方法会遍历数组,将每个元素与一个累积数组进行比较。如果累积数组中不包含当前元素,就把当前元素添加到累积数组中,最后返回这个累积数组,也就是去重后的数组。

方法三:使用 Map 对象

// 定义一个名为 uniqueArray 的函数,用于对数组进行去重操作
function uniqueArray(arr) {
    // 创建一个新的 Map 对象 map,用于存储已经出现过的元素
    const map = new Map();
    // 创建一个空数组 result,用于存储去重后的元素
    const result = [];
    // 遍历数组 arr 中的每个元素
    for (const item of arr) {
        // 检查 Map 对象 map 中是否已经存在当前元素 item 作为键
        if (!map.has(item)) {
            // 如果不存在,将该元素作为键添加到 Map 对象中,并将值设为 true
            map.set(item, true);
            // 同时将该元素添加到结果数组 result 中
            result.push(item);
        }
    }
    // 返回去重后的结果数组
    return result;
}

// 定义一个包含重复元素的测试数组
const testArray = [1, 2, 2, 3, 4, 4, 5];
// 调用 uniqueArray 函数对测试数组进行去重
const result = uniqueArray(testArray);
// 打印去重后的数组
console.log(result);

解释Map 对象可以存储键值对,并且键是唯一的。我们遍历数组,对于每个元素,检查它是否已经作为 Map 的键存在。如果不存在,就把它添加到 Map 中,同时添加到结果数组里;如果已经存在,就跳过该元素。

相关文章:

  • SPI驱动五) -- SPI_DAC上机实验(使用spidev)
  • 事务-Transaction
  • EXCEL自动化13 | 批量重命名工作簿中的工作表
  • 【AD】5-15 Active Route的自动布线辅助
  • postman接口请求中的 Raw是什么
  • 【愚公系列】《Python网络爬虫从入门到精通》045-Charles的SSL证书的安装
  • AIP-161 域掩码
  • AI 时代的新宠儿:向量数据库
  • 渗透测试之利用sql拿shell(附完整流程+防御方案)
  • 深度学习笔记——CNN卷积神经网络
  • Python----数据可视化(Seaborn一:介绍,应用)
  • css动画
  • GetWindowLongPtr函数分析
  • OpenCV 拆分、合并图像通道方法及复现
  • nginx的安装以及相关的全局性配置
  • K8s面试题总结(十一)
  • 使用Arduino和ESP8266进行基于物联网的垃圾箱监控
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules
  • 哈夫曼树的讲解
  • 【微知】如何命令行查看Linux上连接的Wi-Fi信息?(iw dev wlp4s0 link ; information wireless)
  • 网站联盟是什么意思/编程培训
  • 怎么做淘宝网站/阿里指数数据分析平台官网
  • 湖南定制响应式网站有哪些/软件商店安装
  • 适合做网站的图片/重庆快速排名优化
  • 做班级相册网站的目的意义/培训心得体会万能模板
  • 深圳装饰企业前50强/北京云无限优化