最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 数组去重题解 - NaN的识别问题

    正文概述 掘金(Charonmomo)   2021-08-23   581

    问题

    描述

    为 Array 对象添加一个去除重复项的方法

    示例1

    输入: [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
    输出: [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
    

    数组去重本身不难, 需要注意的一个问题是: 如果输入中包含两个NaN该如何处理.

    可以识别NaN:

    • isNaN()

    • includes() 如果存在返回true

        const arr = [1,true,NaN,23,'hello']
        
        // includes 包含
        console.log(arr.includes(NaN))  //true
    
    • Object.is()
    console.log(Object.is(NaN,NaN)); //true
    

    不能识别NaN:

    • indexOf()

    NaN==NaN =>false, 所以indexof是无法判断NaN的下标的

    下面提供了一个思路:

    我们可以根据arr.indexof(item)是否等于当前项的下标来筛选数据,因为indexof只会返回数组中第一次出现的元素的下标, 对于除NaN以外的其他数据来说, 可以通过判断返回的下标和当前元素的下标是否相同来判断。

    需要注意的问题是:

    数组中包含NaN, NaN==NaN =>false, 所以indexof是无法判断NaN的下标的。

    判断NaN的方法:

    • 用Number.isNaN(item)先判断其值是否为number类型, 再判断是否为NaN;
    • 提前声明flag=0, 通过判断flag是否为0来判断是否是重复的NaN. (因为判断条件是flag == 0时, 所以第一次出现的Nan已经被保存到新的数组里了, 并且执行了flag++, 所以后面再次出现的NaN已经不满足flag == 0的条件了, 因此不会被存储到新的数组里)
    Array.prototype.uniq = function () {
        var arr = this;
        var newarr = [];
        var flag = 0;
    
        for(var i=0;i<arr.length;i++){
            if(Number.isNaN(arr[i]) && flag == 0){
                newarr.push(arr[i]);
                flag++;
            }
            else if(arr.indexOf(arr[i]) == i){
                newarr.push(arr[i]);
            }
        }
        return newarr;
    }
    

    起源地下载网 » 数组去重题解 - NaN的识别问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元