JavaScript数组去重操作实例小结
在JavaScript中,数组去重是一个常见的需求,本文将介绍几种实现数组去重的方法,并详细解释每种方法的实现原理和适用场景。
1. 使用Set去重
示例代码:
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]; const uniqueArr = Array.from(new Set(arr)); console.log(uniqueArr); // [1, 2, "abc", true, false, undefined, NaN]
说明:
Set
是ES6引入的一种数据结构,它的特点是元素唯一。
Array.from()
方法可以将类数组对象或可迭代对象转换为数组。
这种方法简单高效,但对NaN和undefined的处理需要注意,因为它们在Set中会被认为相等。
2. 使用Map去重
示例代码:
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]; const map = new Map(); arr.forEach(item => { if (!map.has(item)) { map.set(item, true); } }); const uniqueArr = [...map.keys()]; console.log(uniqueArr); // [1, 2, "abc", true, false, undefined, NaN]
说明:
Map
也是ES6引入的一种数据结构,允许任何值作为键。
通过遍历数组,将每个元素作为键存入Map中,自动去重。
最后通过展开运算符...
获取所有键,形成去重后的新数组。
这种方法同样适用于NaN和undefined。
3. 使用filter和indexOf去重
示例代码:
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]; const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index); console.log(uniqueArr); // [1, 2, "abc", true, false, undefined, NaN]
说明:
filter
方法创建一个新数组,包含通过测试的所有元素。
indexOf
方法返回指定元素在数组中首次出现的索引。
如果元素的索引与其在原数组中的位置相同,则说明该元素是唯一的。
这种方法对NaN无效,因为NaN !== NaN。
4. 使用reduce去重
示例代码:
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]; const uniqueArr = arr.reduce((acc, item) => { if (!acc.includes(item)) { acc.push(item); } return acc; }, []); console.log(uniqueArr); // [1, 2, "abc", true, false, undefined, NaN]
说明:
reduce
方法对数组中的每个元素执行一个由您提供的reducer函数,并将其结果汇总为单个返回值。
在这个例子中,acc
是累加器,初始值为空数组。
includes
方法用来判断当前元素是否已经存在于累加器数组中。
这种方法同样适用于NaN和undefined。
5. 排序后去重
示例代码:
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]; arr.sort(); const uniqueArr = [arr[0]]; for (let i = 1; i < arr.length; i++) { if (arr[i] !== arr[i 1]) { uniqueArr.push(arr[i]); } } console.log(uniqueArr); // [1, 2, "abc", true, false, undefined, NaN]
说明:
首先对数组进行排序。
然后遍历排序后的数组,只添加与前一个元素不同的元素到结果数组中。
这种方法的时间复杂度主要取决于排序算法,通常为O(n log n)。
需要注意的是,排序可能会改变原始数组的顺序。
相关问题与解答
问题1: 为什么使用Set
去重时,NaN
和undefined
会被认为相等?
解答:
在JavaScript中,NaN
与自身不相等(即NaN === NaN
返回false
),而undefined
与自身也不相等,当使用Set
时,Set
会将这两个值视为已经存在,因此它们不会被添加到Set
中,从而导致去重结果中不包含这些值,如果需要保留这些值,可以使用其他方法如Map
或reduce
。
问题2: 如何去除数组中的假值(如false
,0
,""
,null
,undefined
,NaN
)?
解答:
可以使用filter
方法结合Boolean
构造函数来去除数组中的假值。
const arr = [0, 1, false, 2, '', 3, null, 4, undefined, 5, NaN]; const truthyArr = arr.filter(Boolean); console.log(truthyArr); // [1, 2, 3, 4, 5]
在这个例子中,filter(Boolean)
会移除所有假值,只保留真值。
各位小伙伴们,我刚刚为大家分享了有关“JavaScrip数组去重操作实例小结”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!