JavaScript数组去重的五种方法


Posted in Javascript onNovember 05, 2015

javascript数组去重是一个比较常见的需求,解决方法也有很多种,网上都可以找到答案的,下面小编给大家整理了一份关于同类型的数组去重的方法,先给大家介绍下简单实现思路。

思路:

遍历数组,一一比较,比较到相同的就删除后面的

遍历数组,一一比较,比较到相同的,跳过前面重复的,不相同的放入新数组

任取一个数组元素放入新数组,遍历剩下的数组元素任取一个,与新数组的元素一一比较,如果有不同的,放入新数组。

遍历数组,取一个元素,作为对象的属性,判断属性是否存在

1. 删除后面重复的:

function ov(arr){
 //var a=((new Date).getTime())
 for(var i=;i<arr.length;i++)
 for(var j=i+;j<arr.length;j++)
  if(arr[i]===arr[j]){arr.splice(j,);j--;}  
 //console.info((new Date).getTime()-a)  
 return arr.sort(function(a,b){return a-b});
}

2. 这个是常规的方法,比较好理解,如果相同则跳出循环

function ov(a) {
 //var a=((new Date).getTime())
 var b = [], n = a.length, i, j;
 for (i = ; i < n; i++) {
 for (j = i + ; j < n; j++)
  if (a[i] === a[j]){j=false;break;}
 if(j)b.push(a[i]);
 }
 //console.info((new Date).getTime()-a) 
 return b.sort(function(a,b){return a-b});
}

3. 这个我花了好长时间明白的,这里j循环虽然继续了,但是i值已经改变了。就等于是一个新的i循环:

function ov(a) {
 //var a=((new Date).getTime())
 var b = [], n = a.length, i, j;
 for (i = ; i < n; i++) {
 for (j = i + ; j < n; j++)
 if (a[i] === a[j])j=++i
 b.push(a[i]);}
 //console.info((new Date).getTime()-a) 
 return b.sort(function(a,b){return a-b});
}

4. 保证新数组中的都是唯一的

function ov(ar){
//var a=((new Date).getTime())
 var m=[],f;
 for(var i=;i<ar.length;i++){
 f=true;
 for(var j=;j<m.length;j++)
 if(ar[i]===m[j]){f=false;break;};
 if(f)m.push(ar[i])}
//console.info((new Date).getTime()-a) 
 return m.sort(function(a,b){return a-b});
}

5. 用对象属性

function ov(ar){
// var a=(new Date).getTime()
 var m,n=[],o= {};
 for (var i=;(m= ar[i])!==undefined;i++)
 if (!o[m]){n.push(m);o[m]=true;}
// console.info((new Date).getTime()-a) 
 return n.sort(function(a,b){return a-b});;
 }

javascript数组对象的3个属性

1、length 属性

    Length属性表示数组的长度,即其中元素的个数。因为数组的索引总是由0开始,所以一个数组的上下限分别是:0和length-1。和其他大多数语言不同的是,JavaScript数组的length属性是可变的,这一点需要特别注意。当length属性被设置得更大时,整个数组的状态事实上不会发生变化,仅仅是length属性变大;当length属性被设置得比原来小时,则原先数组中索引大于或等于length的元素的值全部被丢失。下面是演示改变length属性的例子:

var arr=[12,23,5,3,25,98,76,54,56,76];

//定义了一个包含10个数字的数组

alert(arr.length); //显示数组的长度10

arr.length=12; //增大数组的长度

alert(arr.length); //显示数组的长度已经变为12

alert(arr[8]); //显示第9个元素的值,为56

arr.length=5; //将数组的长度减少到5,索引等于或超过5的元素被丢弃

alert(arr[8]); //显示第9个元素已经变为"undefined"

arr.length=10; //将数组长度恢复为10

alert(arr[8]); //虽然长度被恢复为10,但第9个元素却无法收回,显示"undefined"

    由上面的代码我们可以清楚的看到length属性的性质。但length对象不仅可以显式的设置,它也有可能被隐式修改。JavaScript中可以使用一个未声明过的变量,同样,也可以使用一个未定义的数组元素(指索引超过或等于length的元素),这时,length属性的值将被设置为所使用元素索引的值加1。例如下面的代码:

var arr=[12,23,5,3,25,98,76,54,56,76];
alert(arr.length);
arr[15]=34;
alert(arr.length);

    代码中同样是先定义了一个包含10个数字的数组,通过alert语句可以看出其长度为10。随后使用了索引为15的元素,将其赋值为15,即arr[15]=34,这时再用alert语句输出数组的长度,得到的是16。无论如何,对于习惯于强类型编程的开发人员来说,这是一个很令人惊讶的特性。事实上,使用new Array()形式创建的数组,其初始长度就是为0,正是对其中未定义元素的操作,才使数组的长度发生变化。

    由上面的介绍可以看到,length属性是如此的神奇,利用它可以方便的增加或者减少数组的容量。因此对length属性的深入了解,有助于在开发过程中灵活运用。

2、prototype 属性

返回对象类型原型的引用。prototype 属性是 object 共有的。

objectName.prototype

objectName 参数是object对象的名称。

说明:用 prototype 属性提供对象的类的一组基本功能。 对象的新实例“继承”赋予该对象原型的操作。

    对于数组对象,以以下例子说明prototype 属性的用途。

    给数组对象添加返回数组中最大元素值的方法。要完成这一点,声明一个函数,将它加入 Array.prototype, 并使用它。

function array_max( )
{
 var i, max = this[0];
 for (i = 1; i < this.length; i++)
 {
 if (max < this[i])
 max = this[i];
 }
 return max;
}
Array.prototype.max = array_max;
var x = new Array(1, 2, 3, 4, 5, 6);
var y = x.max( );

该代码执行后,y 保存数组 x 中的最大值,或说 6。

3、constructor 属性

表示创建对象的函数。

object.constructor //object是对象或函数的名称。

说明:constructor 属性是所有具有 prototype 的对象的成员。它们包括除 Global 和 Math 对象以外的所有 JScript 固有对象。constructor 属性保存了对构造特定对象实例的函数的引用。

例如:

x = new String("Hi");
if (x.constructor == String) // 进行处理(条件为真)

function MyFunc {
// 函数体。
}
y = new MyFunc;
if (y.constructor == MyFunc) // 进行处理(条件为真)

以上内容就是关于本文给大家介绍的JavaScript数组去重的五种方法及javascript数组对象的三个属性,希望大家喜欢。

Javascript 相关文章推荐
javascript eval函数深入认识
Feb 21 Javascript
js中opener与parent的区别详细解析
Jan 14 Javascript
使用Angular缓存父页面数据的方法
Jan 03 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
Jan 19 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
JavaScript注册时密码强度校验代码
Jun 30 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
微信小程序实现滚动Tab选项卡
Nov 16 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 01 Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
javascript实现tab切换的两个实例
Nov 05 #Javascript
Javascript中的return作用及javascript return关键字用法详解
Nov 05 #Javascript
js实现选中页面文字将其分享到新浪微博
Nov 05 #Javascript
使用JQuery实现的分页插件分享
Nov 05 #Javascript
javascript实现tab切换的四种方法
Nov 05 #Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
Nov 05 #Javascript
JS使用正则表达式除去字符串中重复字符的方法
Nov 05 #Javascript
You might like
PHP 信号管理知识整理汇总
2017/02/19 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python获取文件扩展名的方法
2015/07/06 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
Python assert语句的简单使用示例
2019/07/28 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
如何定义一个可复用的服务
2014/09/30 面试题
宣传策划类求职信范文
2014/01/31 职场文书
公司门卫管理制度
2014/02/01 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
操行评语大全
2014/04/30 职场文书
少先队活动总结
2014/08/29 职场文书
涨价通知
2015/04/23 职场文书
新郎接新娘保证书
2015/05/08 职场文书
2015年征兵工作总结
2015/07/23 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
Python echarts实现数据可视化实例详解
2022/03/03 Python