博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript Array Distinct (array.reduce实现)
阅读量:7242 次
发布时间:2019-06-29

本文共 1850 字,大约阅读时间需要 6 分钟。

javascript 没有原生的Distinct功能 . (至少现在还没有)

但我们可以通过简单的script 自己实现 . 
Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值都是唯一的 . 
我相信大家开始的时候都会和我用同一个方法来处理。
那就是开一个新的数组(空),然后 for loop 旧的数组 ,然后复制进去新的数组里面,每次复制进去的时候先检查一篇新数组内是否有了这个值,有了就跳过,没有才加进去 。 
代码 :
  var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
            var new_array = [];
            for (var i = 0; i < old_array.length; i++) {
                var value = old_array[i];
                var is_exist = false;
                for (var j = 0; j < new_array.length; j++) { 
                    if (new_array[j] === old_array[i]) { //检查
                        is_exist = true;
                        break;
                    }
                }
                if (is_exist) continue;//跳过
                new_array.push(old_array[i]); //添加
            }
            alert(new_array); //[1,2,3,4,5]
有些人可能觉得这样效率不太好,因为for loop 很多次匹配 .
有人就建议使用 object 来替代 
代码 : 
  var u = {}, a = [];
        for (var i = 0, l = this.length; i < l; ++i) {
            if (u.hasOwnProperty(this[i])) {
                continue;
            }
            a.push(this[i]);
            u[this[i]] = 1;
        }
        return a;
object 走索引,似乎可以快一些,但是这里有个小问题。
就是如果你的数组中有 object ,这样就会造成错误了。(ECMA6好像不会了)
因为object 的属性不能是 object ,只能是 string 和 number .
所以不鼓励使用这个方法,除非你确保你的数组内的值都是 string , number . 
总结 : 
方法1的文言文写法是这样的 : 
代码 :
  var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
            old_array = old_array.reduce(function (new_array, old_array_value) {
                if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
                return new_array; //最终返回的是 prev value 也就是recorder
            }, []);
最后把它加入 array的 prototype里面就可以啦 
代码 : 
 Array.prototype.distinct = function () {
        return this.reduce(function (new_array, old_array_value) {
            if (new_array.indexOf(old_array_value) == -1) new_array.push(old_array_value);
            return new_array; //最终返回的是 prev value 也就是recorder
        }, []);
    }
调用 :
var old_array = [1, 2, 3, 3, 4, 5]; //3重复了
var new_array = old_array.distinct();

这里顺便提一下 reduce 方法

function(prev,now,index,array) { return prev; }

当index=0时,prev就是我们第一次传入reduce方法的第2个参数 (reduce(fn, 这个值 <--))

接着循环时 now 就是 array 内的值 

每次return的值是下一次循环的 prev 值 , 所以最后我们得到的就是prev. 

 

转载于:https://www.cnblogs.com/keatkeat/p/3896549.html

你可能感兴趣的文章
Linux安装禅道项目管理软件
查看>>
Bootstrap的jq匿名函数,实现分页技术--博客园老牛大讲堂
查看>>
深入理解Aspnet Core之Identity(4)
查看>>
指针解析
查看>>
CentOs7安装部署Zabbix3.4
查看>>
计算机一些常见名词解释
查看>>
1162: 零起点学算法69——查找最大元素
查看>>
linux awk命令用法
查看>>
我和JSON那些事儿
查看>>
注册 创建 显示 刷新窗口(注建显新),事件,消息循环,消息处理,钩子,dll钩子. (注重理解其中的逻辑关系)...
查看>>
Linux强大屏幕截图方法,理论能截取任何图形界面,包括登录界面
查看>>
【分块】bzoj3226 [Sdoi2008]校门外的区间
查看>>
SpringSecurity (Spring权限验证)
查看>>
MFC 实现CTreeCtrl单选
查看>>
HDU 1036 - Average is not Fast Enough!
查看>>
linux——vi和vim的区别
查看>>
分享一个彻底冻结对象的函数——来自阮一峰老师的《ECMAScript 6 入门》
查看>>
【开篇】基于C#+EmguCV的机器视觉平台开发
查看>>
HBase与MongDB等NoSQL数据库对照
查看>>
上海地铁游移动APP需求分析
查看>>