数组去重以及数组对象去重方法总结

  • 一、数组对象去重
    • 1、reduce方法
    • 2、利用原生js+空对象+空数组
    • 3、利用原生js+标志位+空数组
    • 4、利用双指针思想+splice方法
  • 二、数组去重
    • 1、利用新数组+标志位
    • 2、排序+新数组+相邻比较
    • 3、新对象+新数组
    • 4、新数组+indexOf
    • 5、新数组+includes
    • 6、新数组+filter+includes
    • 7、新数组+foreach+includes
    • 8、 双指针思想+splice
    • 9、新数组+lastIndexOf
    • 10、ES6的set 方法

一、数组对象去重

1、reduce方法

原理,新创建一个空对象,然后利用reduce函数的特性,先看一下这个对象里是否有这个id,如果有则跳过,没有将当前值加入preval,并且赋给这个新创建的对象,最终返回的preval一定是去重后的数组对象。

let arr = [{id: 1, name: '周瑜'},{id: 3, name: '王昭君'},{id: 2, name: '亚瑟'},{id: 1, name: '小乔'},{id: 2, name: '大桥'},{id: 3, name: '韩信'}
];
let obj = {}
arr = arr.reduce((preVal,curVal) => {obj[curVal.id] ? "" : obj[curVal.id] = preVal.push(curVal)return preVal},[])
console.log(arr)

2、利用原生js+空对象+空数组

原理,其实和方法一的原理差不多,只不过是通过原生的for循环进行遍历,也是利用新对象去判断是否已经有该值。

let arr = [{id: 1, name: '周瑜'},{id: 3, name: '王昭君'},{id: 2, name: '亚瑟'},{id: 1, name: '小乔'},{id: 2, name: '大桥'},{id: 3, name: '韩信'}
];
//方法二
function distinct(arr,key) {let newObj = {}let newArr = []for(let i=0; i< arr.length; i++) {let temp = arr[i]if(!newObj[temp[key]]) {newObj[temp[key]] = newArr.push(temp)}}console.log(newArr)return newArr
}
distinct(arr,'id')

3、利用原生js+标志位+空数组

原理,其实和上面的方法差不多,上面的方法是利用空对象去做判断是否已经有过某一项,而这个方法是利用flag标志和空数组去判断是否有过某一项。

let arr = [{id: 1, name: '周瑜'},{id: 3, name: '王昭君'},{id: 2, name: '亚瑟'},{id: 1, name: '小乔'},{id: 2, name: '大桥'},{id: 3, name: '韩信'}
];
// 方法三
function distinct(arr,key) {let newArr = []for(let i=0; i<arr.length; i++) {let flag = truefor(let j=0; j<newArr.length; j++) {if(arr[i][key] == newArr[j][key]) {flag = falsebreak}}if(flag == true) {newArr.push(arr[i])}}console.log(newArr)
}
distinct(arr,'id')

也可以多条件去重

function distinctmore(arr, key1, key2, key3) {const newArr = [];for (let i = 0; i < arr.length; i++) {let flag = true;for (let j = 0; j < newArr.length; j++) {if (arr[i][key1] == newArr[j][key1] &&arr[i][key2] == newArr[j][key2] &&arr[i][key3] == newArr[j][key3]) {flag = false;break;}}if (flag) {newArr.push(arr[i]);}}return newArr;
}

4、利用双指针思想+splice方法

这种方法会更改数组的原始数据

function distinct3(arr, key){for(let i = 0; i < arr.length; i++) {for(let j = i+1; j < arr.length; j++) {if(arr[i][key] === arr[j][key]){arr.splice(j, 1);j = j-1;}}}return arr;
}

二、数组去重

1、利用新数组+标志位

思路:定义一个新数组,然后将原数组和新数组的元素对比,若不同则存放在新数组中。

         let arr = [1,8,5,4,21,1,2,2,5,8]function distinct(arr) {let newArr = []for(let i=0; i<arr.length; i++) {let flag = truefor(let j=0; j<newArr.length; j++) {if(arr[i] == newArr[j]) {flag = falsebreak}}if(flag == true) {newArr.push(arr[i])}}console.log(newArr)return newArr}distinct(arr)

2、排序+新数组+相邻比较

思路:先将原数组排序,在与相邻的进行比较,如果不同则存入新数组。

         let arr = [1,8,5,4,21,1,2,2,5,8]function distinct(arr) {let arr2 = arr.sort((a,b) => a-b)let newArr = []for(let i=0; i<arr2.length; i++) {if(arr2[i] != newArr[newArr.length - 1]) {  //这里是length-1是因为每回push进去的都添加到了末尾newArr.push(arr2[i])}}console.log(newArr)return newArr}

3、新对象+新数组

利用对象属性存在的特性,如果没有该属性则存入新数组。

         let arr = [1,8,5,4,21,1,2,2,5,8]function distinct(arr) {let newObj = {}let newArr = []for(let i=0; i<arr.length; i++) {if(!newObj[arr[i]]) {newObj[arr[i]] = newArr.push(arr[i])}}console.log(newArr)return newArr}

4、新数组+indexOf

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []for (let i = 0; i < arr.length; i++) {if (newArr.indexOf(arr[i]) == -1) {newArr.push(arr[i])}}console.log(newArr)return newArr}

5、新数组+includes

利用数组原型对象上的includes方法

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []for (let i = 0; i < arr.length; i++) {if (!newArr.includes(arr[i])) {newArr.push(arr[i])}}console.log(newArr)return newArr}

6、新数组+filter+includes

利用数组原型对象上的 filter 和 includes方法

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []newArr = arr.filter((item) => {return newArr.includes(item) ? '' : newArr.push(item)})console.log(newArr)return newArr}

7、新数组+foreach+includes

利用数组原型对象上的 forEach 和 includes方法

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []arr.forEach((item) => {newArr.includes(item) ? '' : newArr.push(item)})console.log(newArr)return newArr}

8、 双指针思想+splice

利用数组原型对象上的 splice 方法,这种方法会改变原始数组

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {for(let i=0; i<arr.length; i++) {for(let j=i+1; j<arr.length; j++) {if(arr[i] == arr[j]) {arr.splice(j,1)j--}}}console.log(arr)return arr}

9、新数组+lastIndexOf

利用数组原型对象上的 lastIndexOf 方法,其实本质上和使用indexOf是一样的,只不过一个是从前面开始遍历查找,一个是从后面遍历查找

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []for (let i = 0; i < arr.length; i++) {if (newArr.lastIndexOf(arr[i]) == -1) {newArr.push(arr[i])}}console.log(newArr)return newArr}

10、ES6的set 方法

         let arr = [1, 8, 5, 4, 21, 1, 2, 2, 5, 8]function distinct(arr) {let newArr = []//Set数据结构,它类似于数组,其成员的值都是唯一的newArr = Array.from(new Set(arr)) // 利用Array.from将Set结构转换成数组console.log(newArr)return newArr}

参考文章
https://www.jb51.net/article/121410.htm

数组去重以及数组对象去重方法总结相关推荐

  1. c#对象集合去重_C# List 对象去重

    扩展类 public static class ObjectExtensions { public static IEnumerable DistinctBy(this IEnumerable sou ...

  2. JS遍历数组和对象的方法

    JS遍历数组的方法有: for forEach for-in for-of map JS遍历对象的方法有 for-in Object.keys Object.getOwnPropertyNames(o ...

  3. 【ES6】es6数组中对象去重,数组对象去重方法总结---filter()与reduce()实践

    es6数组中对象去重 方法一: filter()与findIndex()给数组去重 1. filter()用法 2. findIndex()用法 3. 去重实战 方法二:reduce()去重 1. r ...

  4. es6方法 数组去重 多个数组去重 数组对象去重

    1.单个数组的去重 Array.from(new Set(arr)) 2.多个数组去重 返回不同数据展示 let a = [1, 2, 3, 4] let b = [3, 4, 5] let unio ...

  5. JavaScript:数组对象去重的几种方法

    数组对象去重 元素是对象类型的数组的去重我这粗分为两类,一类是当数组中整个元素一样时的去重(这里说的一样是指元素对象中的属性和值都一样),第二类是,元素对象中的某一个属性的值一样时进行去重 // 通用 ...

  6. vue js 数组对象去重方法

    一.根据数组中唯一的值去重, cur原数组, next要添加的数据 this.warnSiteWords.push({one:this.valueUrl,two:this.valueName}); l ...

  7. android两个数组对象去重合并,JS 数组,数组对象的合并去重方法

    此次对数组的操做,咱们使用es6的新语法来完成,因此在看下边代码以前,咱们要了解咱们下边要用到的es6中的set集合,和for...of 方法:javascript 首先介绍set集合: ES6提供了 ...

  8. js中给数组中对象去重

    被问到如何给数组中对象去重,想到set答案肯定错误的,这个平时工作中用到的不多,查阅资料,找到给数组中对象去重的方法,利用对象属性名的唯一性,怪自己当时没想到. 方法一: let ary=[{id: ...

  9. js实现数组对象去重

    数组对象去重,可直接复用 /***数组对象去重** @param {Array} arr 去重数组* @param {String} key 唯一标识*/ deduplication(arr, key ...

最新文章

  1. eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现
  2. 什么是设计模式(Design Patterns)
  3. angularjs directive scope变化为啥html,学习AngularJs:Directive指令用法(完整版)
  4. 【KERAS/直方图均衡化】图像数据集扩充
  5. 【今日CV 计算机视觉论文速览 第120期】Thu, 23 May 2019
  6. IIS启用GZip压缩
  7. 【Typecho插件-前端-播放器】BiliVid -- 好用的Bilibili视频链接解析播放器
  8. 照片放大模糊怎么变清晰,图片无损放大
  9. ffmpeg视频录制
  10. 刚开发的游戏《天黑请闭眼》
  11. 使用bert模型做句子分类
  12. 数据可视化和可视化分析:你能看到数据世界
  13. 盒子模型属性详解及案例
  14. matlab中plot矢量长度,关于plot函数矢量长度弹错的问题
  15. 关于显著性检验,有你想要的!
  16. Java 实现高并发秒杀
  17. Java顺序表就地逆置_顺序表的就地逆置问题
  18. 外观数列(Look-and-say sequence)
  19. 运放-1-理想运放与虚断虚短的来源
  20. 【数据库系统01】强制存取控制

热门文章

  1. 【C#设计模式】总目录(共23种)【已全部完结!】
  2. Unity打包Android的apk文件时有关Json的注意事项
  3. 赛门铁克承诺提供证书审计计划来安抚 Google
  4. 【每日新闻】中国研发开支2017年达到1.76万亿元 | 全球用户可在阿里云上选用红帽企业Linux
  5. 机器学习实战之SVM与二分类
  6. 新iPhone全面5G!最便宜只要5500,均内置中国北斗-1
  7. 自定义Log4j配置文件位置
  8. 历嫁两姓三辈四任可汗的大唐公主
  9. SAP MM采购申请审批-成本中心
  10. 软件分享:图片加水印用什么软件?