数组去重,一般需求是给你一个数组,调用去重方法,返回数值副本,副本中没有重复元素。一般来说,两个元素通过 === 比较返回 true 的视为相同元素,需要去重,所以,1 和 "1" 是不同的元素,1 和 new Number(1) 是不同的元素,{} 和 {} 是不同的元素(引用不同)。(当然如果需求认为 {} 和 {} 算作相同的元素,那么解法就不一样了)

method 1
使用两重循环
function unique(arr) {
var res = [];
for(var i = 0, len = arr.length;i < len; i++) {
var item = arr[i];
for(var j = 0, jLen = res.length; j<jLen; j++) {
if(item == res[j]) break;
}
if(j == jLen) res.push(item);
}
return res;
}
method 2
function unique(arr) {
var ret = []
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
if (ret.indexOf(item) === -1) {
ret.push(item)
}
}
return ret
}
这里判断可以使用一个语法糖
function unique(arr) {
var res = [];
for(var i = 0, len = arr.length;i < len; i++) {
var item = arr[i];
(res.indexOf(item) === -1) && res.push(item);
}
return res;
}
但是在低版本浏览器并没有 indexOf
var indexOf = [].indexOf ?
function(arr, item) {
return arr.indexOf(item)
} :
function indexOf(arr, item) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === item) {
return i
}
}
return -1
}
function unique(arr) {
var ret = []
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
if (indexOf(ret, item) === -1) {
ret.push(item)
}
}
return ret
}
method3
使用两重循环的另外一种比较方式,前面是将原数组的元素和结果数组一一比较,下面我们可以将原数组的重复元素的最后一个元素放入数组中
function unique(arr) {
var ret = [];
var len = arr.length;
var isRepeat;
for(var i=0; i<len; i++) {
isRepeat = false;
for(var j=i+1; j<len; j++) {
if(arr[i] === arr[j]){
isRepeat = true;
break;
}
}
if(!isRepeat){
ret.push(arr[i]);
}
}
return ret;
}
这里还有一个优化的版本
function unique(a) {
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
for (var j = i + 1; j < len; j++) {
// 这一步十分巧妙
// 如果发现相同元素
// 则 i 自增进入下一个循环比较
if (a[i] === a[j])
j = ++i; //j = i = i + 1;
}
res.push(a[i]);
}
return res;
}
method4
用 javascript 中的 object 对象来当作 哈希表
function dedup(arr) {
var hashTable = {};
return arr.filter(function(value,index,arr){
var key = JSON.stringify(value);
var match = Boolean(hashTable[key]);
return (match ? false : hashTable[key] = true);
});
}
因为 Object 的 key 值都是 String 类型,所以对于 1 和 "1" 无法分别,我们可以稍微改进下,将类型也存入 key 中
function dedup(arr) {
var ret = [];
var hash = {};
for(var i = 0; i < arr.length; i++) {
var item = arr[i];
var key = typeof(item) + item;
if(hash[key] !== 1) {
ret.push(item)
hash[key] = 1;
}
}
return ret;
}
总结
以上所述是小编给大家介绍的JavaScript数组去重的多种方法(四种),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# js
# 数组去重
# JavaScript数组去重的两种方法推荐
# JavaScript数组去重的五种方法
# js数组去重的5种算法实现
# javascript数组去重的六种方法汇总
# js数组去重的方法汇总
# JS数组去重与取重的示例代码
# 关于js数组去重的问题小结
# js数组去重的常用方法总结
# 两个数组去重的JS代码
# 我们可以
# 小编
# 将原
# 都是
# 给你
# 在此
# 给大家
# 还有一个
# 可以使用
# 四种
# 所述
# 给我留言
# 感谢大家
# 版本浏览器
# 组中
# 疑问请
# 有任何
# 样了
# 但是在
# 这一步
相关文章:
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何基于云服务器快速搭建网站及云盘系统?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
建站之星安装后如何自定义网站颜色与字体?
制作网站公司那家好,网络公司是做什么的?
如何在云主机上快速搭建多站点网站?
已有域名能否直接搭建网站?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站主机选购指南:核心配置优化与品牌推荐方案
宝塔Windows建站如何避免显示默认IIS页面?
一键网站制作软件,义乌购一件代发流程?
如何在云虚拟主机上快速搭建个人网站?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
c# 在高并发场景下,委托和接口调用的性能对比
如何正确选择百度移动适配建站域名?
家具网站制作软件,家具厂怎么跑业务?
建站之星如何快速生成多端适配网站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
制作网页的网站有哪些,电脑上怎么做网页?
三星网站视频制作教程下载,三星w23网页如何全屏?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
微信小程序制作网站有哪些,微信小程序需要做网站吗?
表情包在线制作网站免费,表情包怎么弄?
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何通过虚拟主机快速完成网站搭建?
寿县云建站:智能SEO优化与多行业模板快速上线指南
制作农业网站的软件,比较好的农业网站推荐一下?
如何用美橙互联一键搭建多站合一网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
网站制作软件有哪些,制图软件有哪些?
如何选择适合PHP云建站的开源框架?
Python如何创建带属性的XML节点
大学网站设计制作软件有哪些,如何将网站制作成自己app?
5种Android数据存储方式汇总
如何通过万网虚拟主机快速搭建网站?
如何快速辨别茅台真假?关键步骤解析
香港服务器选型指南:免备案配置与高效建站方案解析
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何用PHP快速搭建高效网站?分步指南
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
如何通过免费商城建站系统源码自定义网站主题与功能?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何基于云服务器快速搭建个人网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。