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()方 ...
随机推荐
- Selenium 初见
Selenium名字的来源 在这里,我还想说一下关于Selenium名字的来源,很有意思的: >:Selenium的中文名为“硒”,是一种化学元素的名字,它对汞 (Mercury)有天然的解毒作 ...
- JS验证手机号码
对于表单的验证是添加信息的时候必不可少的. 下面是基于EasyUI-validatebox拓展的对手机.座机号的验证方法. PhoneAndMobile: { validator: function ...
- static关键字使用
static关键字对一些公共使用的数据,比如是饭店筷子,不可能说每个人去饭店吃饭的时候自带一双筷子,饭店的筷子对于进店吃饭的对象都是公共的; 静态变量,跟其他变量不同的是,它是与类关联的,其他变量则是 ...
- Ensures there will be no 'console is undefined' errors
很早之前项目中遇到过这种bug, 当时没有多留意,只是暂时把笔记留了下来,今天整理笔记的时候,看到了,故先整理在此,具体用法下次遇到再好好理解理解.如果有筒子遇到过,麻烦留言说一下,先谢谢啦. //E ...
- Redis源代码分析(三)---dict哈希结构
昨天分析完adlist的Redis代码.今天立即马不停蹄的继续学习Redis代码中的哈希部分的结构学习,只是在这里他不叫什么hashMap,而是叫dict.并且是一种全新设计的一种哈希结构,他仅仅是通 ...
- 沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化測试“星云測试“的使用攻略
沧海一声笑,移动应用的CRASH原因我找到! --记最新款数字化測试"星云測试"的使用攻略 世界进步那么快,非常多新奇的点子层出不穷,于是我们创业.我们做最酷的手机应用,做最轰炸的 ...
- Android布局属性详解剖析
View的布局显示方式有下面几种: 线性布局(LinearLayout) 相对布局(RelativeLayout) 表格布局(TableLayout) 网格视图(GridView) 标签布局(TabL ...
- 百度——LBS.云 v2.0——创建自己的地理云数据
随着云技术和地理信息(GIS)技术的发展,今年终于进入了.地理分享的新纪元.百度提供了LBS的云存储.真是个不错的功能.下面让我们来看看如何使用吧. 1.注册百度开发者账号(此处略去88个字) 2.创 ...
- NSRunLoop(来自官方文档)
The NSRunLoop class declares the programmatic interface to objects that manage input sources. An NSR ...
- Android项目中如何用好构建神器Gradle?(转)
最近在忙团队并行开发的事情,主要是将各个团队的代码分库,一方面可以降低耦合,为后面模块插件化做铺垫,另一方面采用二进制编译,可以加快编译速度.分库遇到了一些问题,很多都要通过Gradle脚本解决,所以 ...