js集合set去重方法_js集合set去重技巧详解

js集合set去重方法_js集合set去重技巧详解
最新回答
狙击甜心

2023-08-10 00:24:35

JavaScript中利用Set集合去重是一种简洁高效的方式,以下是详细介绍:

Set去重的基本方法

Set对象天生具备去重特性,将数组转换为Set再转回数组即可实现去重。

function uniqueArray(arr) { return [...new Set(arr)];}// 示例const myArray = [1, 2, 2, 3, 4, 4, 5];const uniqueArrayResult = uniqueArray(myArray);console.log(uniqueArrayResult); // 输出: [1, 2, 3, 4, 5]

核心原理:new Set(arr)创建包含arr中所有唯一值的Set对象,扩展运算符...将Set对象转换回数组。

优势

  • 代码简洁:相比传统循环判断方式,代码量更少。
  • 可读性强:逻辑清晰,易于理解。
  • 性能较好:处理大型数组时通常性能更优。
Set去重的局限性
  • 无法去除NaN重复值:Set认为NaN和NaN是不同的,无法去除数组中多个NaN值。
const arrWithNaN = [1, NaN, NaN, 2];const uniqueArrWithNaN = [...new Set(arrWithNaN)];console.log(uniqueArrWithNaN); // 输出: [1, NaN, NaN, 2]
  • 无法识别相同对象字面量:即使两个对象字面量完全相同,Set也会认为它们是不同的。
const arrWithObjects = [{a: 1}, {a: 1}];const uniqueArrWithObjects = [...new Set(arrWithObjects)];console.log(uniqueArrWithObjects); // 输出: [{a: 1}, {a: 1}]

应对方法:对于包含NaN或对象的数组,可使用filter和indexOf,或使用第三方库如Lodash。

Set用于其他数据结构的间接去重

Set主要用于数组去重,但可间接用于其他数据结构去重。例如,先将链表或树转换为数组,使用Set去重,再将结果转换回原始数据结构。

// 假设链表有toArray()方法将其转换为数组class LinkedList { constructor() { this.head = null; } toArray() { let arr = []; let current = this.head; while(current) { arr.push(current.data); current = current.next; } return arr; }}// 示例使用const linkedList = new LinkedList();// ... 向链表添加数据 ...const arrayFromLinkedList = linkedList.toArray();const uniqueArrayFromLinkedList = [...new Set(arrayFromLinkedList)];// 然后将uniqueArrayFromLinkedList转换回链表

注意事项:需根据具体数据结构调整转换过程,确保不丢失关键信息。

根据对象属性去重的复杂场景处理

当需要根据对象某个属性去重时,Set无法直接实现,可使用Map或reduce方法。

function uniqueArrayByProperty(arr, property) { const map = new Map(); return arr.filter((item) => { if (!map.has(item[property])) { map.set(item[property], true); return true; } return false; });}// 示例const myArray = [{id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 1, name: 'C'}];const uniqueArrayById = uniqueArrayByProperty(myArray, 'id');console.log(uniqueArrayById); // 输出: [{id: 1, name: 'A'}, {id: 2, name: 'B'}]

原理:使用Map存储已出现过的属性值,用filter过滤掉重复对象。

优势

  • 灵活性高:可根据不同属性进行去重。
  • 适用性广:适用于各种复杂对象数组的去重场景。
总结
  • 简单数组去重:直接使用Set集合,代码简洁高效。
  • 包含NaN或对象的数组:采用filter和indexOf或第三方库。
  • 其他数据结构去重:先转换为数组,用Set去重后再转回原始结构。
  • 按对象属性去重:使用Map结合filter方法实现。