关于数组去重

// 关于数组去重

const list = [3, 3, 4, 5, 2, 3, 34, 45, 38, 19, 34, 90, 3, 3, 6, 7, 8,]

// 使用filter
function run (list) {
    const list2 = []
    list.filter(item => {
        if (!list2.includes(item)) {
            list2.push(item)
        }
    })
    return list2
}

console.log(run(list))

// 使用map
function run2 (list) {
    const map = new Map()
    list.map((item, index) => {
        map.set(item, index)
    })
    const list2 = []
    map.forEach((value, key) => {
        list2.push(key)
        // console.log(key)
    })
    return list2
}

console.log(run2(list))
### 关于数组的技术细节 在 JavaScript 中,`unique` 并不是一个内置函数或方法,但它可以通过多种方式实现来完成数组的任务。以下是几种常见的数组方法及其技术细节: #### 1. 使用 `Set` 数据结构 `Set` 是 ES6 引入的一种数据结构,它天然具有的功能。通过将数组转换为 `Set` 对象再转回数组即可轻松实现。 ```javascript function uniqueUsingSet(arr) { return [...new Set(arr)]; } ``` 这种方法简单高效,适用于大多数场景[^1]。 --- #### 2. 双层循环法 双层循环是一种基础的方法,虽然性能较差(时间复杂度为 O(n²)),但在某些特定情况下仍然适用。 ```javascript function uniqueUsingDoubleLoop(arr) { const result = []; for (let i = 0; i < arr.length; i++) { let isUnique = true; for (let j = 0; j < result.length; j++) { if (arr[i] === result[j]) { isUnique = false; break; } } if (isUnique) { result.push(arr[i]); } } return result; } ``` 该方法适合处理小型数组,在大数据量下不推荐使用[^2]。 --- #### 3. 利用对象作为哈希表 利用对象的键唯一性可以快速判断某个值是否已经存在,从而达到的目的。 ```javascript function uniqueUsingObjectHash(arr) { const hashTable = {}; const result = []; for (const item of arr) { if (!hashTable[item]) { hashTable[item] = true; result.push(item); } } return result; } ``` 需要注意的是,这种做法可能无法正确处理特殊类型的值(如 `NaN` 或对象)[^3]。 --- #### 4. 使用 `filter` 和 `indexOf` 结合 `Array.prototype.filter` 和 `Array.prototype.indexOf` 方法也可以实现数组。 ```javascript function uniqueUsingFilterAndIndexOf(arr) { return arr.filter((item, index) => arr.indexOf(item) === index); } ``` 这种方式简洁明了,但对于大型数组可能会有一定的性能开销。 --- #### 5. 处理特殊情况(如 NaN、对象) 当数组中包含特殊类型的数据时(如 `NaN` 或对象),上述部分方法可能失效。此时可借助 JSON 字符串化或其他手段解决。 ```javascript function uniqueHandlingSpecialCases(arr) { const seenStrings = new Map(); return arr.filter(item => { const stringifiedItem = JSON.stringify(item); if (seenStrings.has(stringifiedItem)) { return false; } else { seenStrings.set(stringifiedItem, true); return true; } }); } ``` 此方法能够有效应对复杂的嵌套对象或特殊数值的情况。 --- ### 总结 不同的方法各有优劣,具体选择取决于实际需求和输入数据的特点。如果追求效率且兼容性强,则优先考虑基于 `Set` 的解决方案;而对于更复杂的场景,则需综合运用其他技巧以满足要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名之辈无名之辈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值