• 作者:老汪软件技巧
  • 发表时间:2024-09-11 17:01
  • 浏览量:

1. 引言

在实际开发过程中,我们经常需要处理包含重复元素的数组,除了简单的基础数组去重(只包含数字或字符串),还有对象数组等复杂数组,在面试中,对于数组去重,也是一个高频考点,因此掌握多种数组去重方法是非常必要的。

2. 基础去重方法2.1:双重 for 循环

function removeDuplicates(arr) {
  for (let i = arr.length - 1; i > 0; i--) {
    for (let j = i - 1; j >= 0; j--) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
      }
    }
  }
  return arr;
}
const basicArray = [1, 2, 3, 4, 4, 5, 6, 6, 7];
console.log(removeDuplicates(basicArray)); // 输出: [1, 2, 3, 4, 5, 6, 7]

实现简单,易于理解,时间复杂度较高(O(n^2)),不适合大规模数据。

2.2:使用 Set 去重

function removeDuplicatesWithSet(arr) {
  return [...new Set(arr)];
}
const basicArray = [1, 2, 3, 4, 4, 5, 6, 6, 7];
console.log(removeDuplicatesWithSet(basicArray)); // 输出: [1, 2, 3, 4, 5, 6, 7]

简洁高效,时间复杂度较低(O(n)),仅适用于基本类型数组。

2.3 :使用 filter 去重

function removeDuplicatesWithFilter(arr) {
  return arr.filter((item, index, arr) => arr.indexOf(item) === index);
}
const basicArray = [1, 2, 3, 4, 4, 5, 6, 6, 7];
console.log(removeDuplicatesWithFilter(basicArray)); // 输出: [1, 2, 3, 4, 5, 6, 7]

简洁,易于理解,时间复杂度较高(O(n^2)),不适合大规模数据。

数组技巧__数组基础知识

3. 面向对象数组的去重

在解决对象数组去重问题时,我们需要一个方法来判断对象之间的相等性。通常,JavaScript 的默认比较机制(如 ===)不能正确处理对象的比较,因为它们比较的是对象的引用而不是内容。因此,我们需要一个自定义的比较函数来递归地比较对象的所有属性。

遍历输入数组:

使用比较函数:

添加唯一元素:

// 定义一个包含对象的数组
const arr = [
    {name: 'midsummer', age: '18', like: {n: 1}},
    {name: 'midsummer', age: '18', like: {n: 1}},
    {name: 'midsummer', age: '18'},
    {name: 'summer', age: '18'},
    {name: 'midsummer', age: '20'}
];
// 定义一个去重函数,用于处理对象数组
function uniqueArr(arr) {
    let res = [];
    
    for (let i = 0; i < arr.length; i++) {
        // 假设当前元素没有找到重复项
        let isFind = false;
        // 内层循环,遍历已去重的结果数组
        for (let j = 0; j < res.length; j++) {
            // 如果当前元素与结果数组中的某一项相等,则标记为已找到重复项
            if (equals(arr[i], res[j])) {
                isFind = true;
                break;
            }
        }
        // 如果当前元素没有找到重复项,则将其添加到结果数组中
        if (!isFind) {
            res.push(arr[i]);
        }
    }
    return res;
}
// 定义一个比较函数,用于判断两个对象是否相等
function equals(v1, v2) {
    // 如果两个对象都是非空对象,则递归比较它们的每个属性
    if ((typeof v1 === 'object' && v1 != null) && (typeof v2 === 'object' && v2 != null)) {
        // 遍历第一个对象的属性
        for (let key in v1) {
            // 检查第二个对象是否有相同的属性
            if (v2.hasOwnProperty(key)) {
                // 如果两个属性值不相等,则返回 false
                if (!equals(v1[key], v2[key])) {
                    return false;
                }
            } else {
                // 如果第二个对象没有相同的属性,则返回 false
                return false;
            }
        }
        // 如果所有属性都相等,则返回 true
        return true;
    } else {
        // 如果两个对象都是基本类型,则直接比较它们是否相等
        return v1 === v2;
    }
}
// 调用 uniqueArr 函数进行去重,并打印结果
console.log(uniqueArr(arr));

uniqueArr 函数:

equals 函数:

如果两个对象都是基本类型,则直接比较它们是否相等。

4. 总结

从基础的数字和字符串数组去重到复杂对象数组的去重,展示了多种方法和技术,包括双重 for 循环、Set 和 filter,以及通过递归比较函数 equals 来处理复杂对象数组去重的方法。通过理解不同去重方法背后的逻辑和适用场景,友友们可以灵活应对实际开发中的数据处理需求,并在面试中展示扎实的编程基础和算法思维。