写一个数组去重的方法(支持多维数组)

在前端开发中,处理多维数组的去重问题可以稍微复杂一些,因为你需要递归地检查数组的每一层。以下是一个使用JavaScript编写的函数,该函数可以处理多维数组的去重问题:

function uniqueMultiDimArray(arr) {
    const uniqueArr = [];
    const seen = new Set();

    function traverseAndCheck(item) {
        // 如果项是数组,则递归处理
        if (Array.isArray(item)) {
            const uniqueSubArr = [];
            for (const subItem of item) {
                traverseAndCheck(subItem);
                if (!seen.has(JSON.stringify(uniqueSubArr))) {
                    uniqueSubArr.push(subItem);
                }
            }
            if (uniqueSubArr.length) {
                seen.add(JSON.stringify(uniqueSubArr));
                uniqueArr.push(uniqueSubArr);
            }
        } else {
            // 如果项不是数组,则检查是否已经见过
            const itemStr = JSON.stringify(item);
            if (!seen.has(itemStr)) {
                seen.add(itemStr);
                uniqueArr.push(item);
            }
        }
    }

    // 遍历原始数组并检查每个项
    for (const item of arr) {
        traverseAndCheck(item);
    }

    return uniqueArr;
}

// 示例用法:
const multiDimArray = [1, 2, [3, 4], [3, 4], 5, [6, [7, 8]], [6, [7, 8]], 9];
const uniqueArray = uniqueMultiDimArray(multiDimArray);
console.log(uniqueArray);
// 输出: [1, 2, [3, 4], 5, [6, [7, 8]], 9]

注意:这个方法使用了JSON.stringify来将数组和对象转换为字符串,以便在Set中进行比较。这种方法在处理包含简单数据类型(如数字、字符串和布尔值)的多维数组时效果很好,但如果数组中包含函数、循环引用或特殊对象(如Date对象或具有特定方法的对象),则可能无法正确工作。对于这些更复杂的情况,你可能需要编写更复杂的自定义比较逻辑。

另外,由于JSON.stringify的性能开销,如果处理非常大的数组,这个方法可能会比较慢。在这种情况下,你可能需要考虑其他优化策略。

posted @ 2025-01-13 06:05  王铁柱6  阅读(26)  评论(0)    收藏  举报