数组去重
原始变量
如果一个数组只包含原始变量,我们可以使用filter
和indexOf
方法将其去重:
1 | var deduped = [ 1, 1, 'a', 'a' ].filter(function (el, i, arr) { |
ES2015
我们可以使用箭头函数使写法更简明:
1 | var deduped = [ 1, 1, 'a', 'a' ].filter( (el, i, arr) => arr.indexOf(el) === i); |
但是根据Sets和from
方法的介绍,我们可以更简明的实现。
1 | var deduped = Array.from( new Set([ 1, 1, 'a', 'a' ]) ); |
Objects
当元素为对象(Object)时,我们就不能用这种办法了,
因为对象存储的是引用而原始变量存储的是值。
1 | 1 === 1 // true |
因此我们需要改变一下我们的实现方法,使用哈希表。
1 | function dedup(arr) { |
因为哈希表在Javascript里是一个简单的Object
,它的key
永远是String
类型。这意味着我们不能区分字符串和数字表示的相同的值,如1
和'1'
。
1 | var hashTable = {}; |
然而,因为我们使用的JSON.stringify
,String
类型的key
将会被存储为一个字符串值,这样hashTable
的key
就唯一了。
1 | var hashTable = {}; |
这意味着相同的值,但不同类型的元素,将以原来的格式保留。
1 | var deduped = dedup([ |
阅读材料
函数
ES2015
Stack overflow
原文作者: anhr
原文链接: http://yoursite.com/2019/11/04/javascript/2016-02-06-deduplicate-an-array/
版权声明: 转载请注明出处(必须保留原文作者署名原文链接)