资讯专栏INFORMATION COLUMN

20170614-数组去重

0x584a / 731人阅读

测试用例
var arr = [1,1,"1","1",0,0,"0","0",undefined,undefined,null,null,NaN,NaN,{},{},[],[],/a/,/a/]
indexOf
function unique(arr){
    var temp = []
    for(var i=0;i [ 1, "1", 0, "0", undefined, null, {}, {}, [], [], /a/, /a/ ]

NaN丢失

function unique(arr){
    var temp = []
    arr.forEach(function(item){
        if(temp.indexOf(item) === -1){
            temp.push(item)
        }
    })
    return temp
}
console.log(unique(arr))
> [ 1, "1", 0, "0", undefined, null, NaN, NaN, {}, {}, [], [], /a/, /a/ ]

NaN重复

indexOf认为NaN与NaN是不重复的

includes
function unique(arr){
    var temp = []
    for(var i=0;i  [1, "1", 0, "0", undefined, null, NaN, {}, {}, [], [], /a/, /a/]

includes认为NaN和NaN是重复的

===
function unique(arr){
    var temp = []
    var isRepeat = false
    for(var i=0;i [1, "1", 0, "0", undefined, null, NaN, NaN, {}, {}, [], [], /a/,/a/]

NaN重复

使用对象实现数组去重及改进
function unique(arr){
    var obj = {}
    var temp = []
    for(var i=0;i [ 1, 0, undefined, null, NaN, {}, [], /a/ ]

无法区分隐式类型转换成字符串后一样的值,比如1和"1"

无法处理复杂数据类型,比如对象(因为对象作为key会变成[object Object])

改进1
function unique(arr){
    var obj = {}
    var temp = []
    var key
    for(var i=0;i [ 1, "1", 0, "0", undefined, null, NaN, {}, [], /a/ ]
改进2
function unique(arr){
    var obj = {}
    var temp = []
    var key
    for(var i=0;i [ 1, "1", 0, "0", undefined, null, NaN, {}, [] ]
map
function unique(arr){
    var temp = []
    var map = new Map()
    for(var i=0; i [ 1, "1", 0, "0", undefined, null, NaN, {}, {}, [], [], /a/, /a/ ]
set
function unique(arr){
    var set = new Set(arr)
    return Array.from(set)
}
console.log(unique(arr))
> [ 1, "1", 0, "0", undefined, null, NaN, {}, {}, [], [], /a/, /a/ ]
各种方法比较

总结

数组去重需要根据场景选择合适的去重方法,没有固定的答案。

参考资料

谈JavaScript数组去重

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83426.html

相关文章

  • JS数组去重总结

    摘要:数组去重,一般会在面试的时候才会碰到,要求手写数组去重方法的代码。在实际项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。数组去重的方法一利用去重中最常用如果不考虑兼容性,这种去重的方法代码最少。 数组去重,一般会在面试的时候才会碰到,要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。 在实际项目中碰到的...

    whinc 评论0 收藏0
  • 跟underscore一起学数组去重

    摘要:引子数组去重是一个老生常谈的话题,在面试中也经常会被问道。其中如果数组是排序的,去重运算效率更高,因为排序能够将相同的数排列在一起,方便前后比较。当数组有序对于对象的去重,我们知道为,所以使用比较对象在实际场景中没有意义。 引子 数组去重是一个老生常谈的话题,在面试中也经常会被问道。对于去重,有两种主流思想: 先排序,线性遍历后去重,时间复杂度O(n*log2n); 使用哈希,空间换...

    flybywind 评论0 收藏0
  • JavaScript专题之数组去重

    摘要:专题系列第三篇,讲解各种数组去重方法,并且跟着写一个前言数组去重方法老生常谈,既然是常谈,我也来谈谈。它类似于数组,但是成员的值都是唯一的,没有重复的值。 JavaScript 专题系列第三篇,讲解各种数组去重方法,并且跟着 underscore 写一个 unique API 前言 数组去重方法老生常谈,既然是常谈,我也来谈谈。 双层循环 也许我们首先想到的是使用 indexOf 来循...

    fsmStudy 评论0 收藏0
  • JavaScript数组去重(12种方法,史上最全)

    摘要:数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些你能答出其中的种,面试官很有可能对你刮目相看。数组去重的方法一利用去重中最常用不考虑兼容性,这种去重的方法代码最少。 数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看...

    rozbo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<