生活只有在平淡无味的人看来才是空虚而平淡无味的。 ——<尼古拉·加夫里诺维奇·车尔尼雪夫斯基>
如果Array
仅包含原始值,则可以仅使用 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); |
但是通过引入 Set
和 from
方法,我们可以更简洁地达到相同的结果。
1 | var deduped = Array.from( new Set([ 1, 1, 'a', 'a' ]) ); |
对象
当元素是对象时,我们不能使用相同的方法,因为对象是通过引用存储的,而基元是通过值存储的。
1 | 1 === 1 // true |
因此,我们需要更改方法并使用哈希表。
1 | function dedup(arr) { |
由于 JavaScript
中的哈希表只是一个Object
,因此键将始终为类型String
。这意味着通常我们无法区分具有相同值(即1和)的 字符串和数字’1’。
1 | var hashTable = {}; |
但是,因为我们正在使用 JSON.stringify
,所以类型的键String
将存储为转义的字符串值,从而在中提供了唯一的键hashTable
。
1 | var hashTable = {}; |
这意味着相同值但类型不同的重复元素仍将使用相同的实现进行重复数据删除。
1 | var deduped = dedup([ |
参考
- https://www.jstips.co/en/javascript/deduplicate-an-array/
- MDN - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
关注【公众号】,了解更多。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!