Javascript Array Distinct (array.reduce实现)
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.
Javascript Array Distinct (array.reduce实现)的更多相关文章
- JavaScript高级编程——Array数组迭代(every()、filter()、foreach()、map()、some(),归并(reduce() 和reduceRight() ))
JavaScript高级编程——Array数组迭代(every().filter().foreach().map().some(),归并(reduce() 和reduceRight() )) < ...
- 详解Javascript中的Array对象
基础介绍 创建数组 和Object对象一样,创建Array也有2种方式:构造函数.字面量法. 构造函数创建 使用构造函数的方式可以通过new关键字来声明,如下所示: 12 var arr = new ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 从头开始学JavaScript (十二)——Array类型
原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...
- JavaScript之对象Array
数组Array是JavaScript中最常用的类型之一,同一数组中可以保存任意类型的数据,并且它的长度是动态的,会随着数组中数据的加减自动变化.每个数组都有一个表示其长度(数组元素的个数)的lengt ...
- javascript类型系统之Array
原文:javascript类型系统之Array 目录 [1]数组创建 [2]数组操作 [3]继承的方法 [4]实例方法 数组转换 数组检测 栈和队列 排序方法 操作方法 位置方法 前面的话 数组是一组 ...
- JavaScript引用类型之Array数组的toString()和valueof()方法的区别
一.转换方法 1.在JavaScript中几乎所有对象都具有toLocaleString().toString和valueof()方法,因为,所有的对象都继承自Object,而前面所说的方法都是Obj ...
- ExtJS学习-----------Ext.Array,ExtJS对javascript中的Array的扩展
关于ExtJS对javascript中的Array的扩展.能够參考其帮助文档,文档下载地址:http://download.csdn.net/detail/z1137730824/7748893 因为 ...
- JavaScript中数组Array方法详解
ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...
随机推荐
- 在SQL中用正则表达式替换html标签
由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...
- jQuery.holdReady()方法用法实例
调用此方法可以延迟jQuery的ready事件,也就是说尽管文档已经加载完成,也不会执行ready事件处理方法.可以多次调用jQuery.holdReady()方法,以延迟jQuery的ready事件 ...
- 转:jQuery LigerUI 使用教程表格篇(3) 复选框、多表头、分组、汇总和明细
阅读目录 复选框 多表头 分组 汇总 明细 复选框 grid可以设置复选框模式进行多选,只需要简单的配置 checked:true 获取选中行 如果要获取选中的行,可以用getSelecteds方法: ...
- (转)Maven实战(七)settings.xml相关配置
一.简介 settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们 ...
- Linux下几个常用的快捷键,真的很实用
1. [tab] 键 在linux所有的shell中,[tab]是最常用的也是linux的bash shell中最棒的功能:它具有命令补全和档案补全的功能.如果不使用[tab]键,那就别说自己懂li ...
- Java基础知识强化72:正则表达式之判断功能(手机号码判断 和 校验邮箱)
1. 判断功能: 使用了String类的matches方法,如下: public boolean matches(String regex): 2. 判断手机号码的案例: package cn.it ...
- 修改用户的home路径
1.直接修改/etc/passwd文件 2.usermod -d /hadoop -u 1531 附:usermod详细参数 语 法:usermod [-LU][-c <备注>][-d & ...
- 自定义Toast
简易自定义Toast public class MainActivity extends ListActivity );//边角 gradientDrawable.setGradien ...
- jquery插件--多行文本缩略
1.webkit内核多行缩略样式 text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orie ...
- spring的xml的property和constructor-arg的解析
参考文档: http://zzy7182.iteye.com/blog/1153473