数组去重以及数组对象去重方法总结
数组去重以及数组对象去重方法总结
- 一、数组对象去重
- 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
数组去重以及数组对象去重方法总结相关推荐
- c#对象集合去重_C# List 对象去重
扩展类 public static class ObjectExtensions { public static IEnumerable DistinctBy(this IEnumerable sou ...
- JS遍历数组和对象的方法
JS遍历数组的方法有: for forEach for-in for-of map JS遍历对象的方法有 for-in Object.keys Object.getOwnPropertyNames(o ...
- 【ES6】es6数组中对象去重,数组对象去重方法总结---filter()与reduce()实践
es6数组中对象去重 方法一: filter()与findIndex()给数组去重 1. filter()用法 2. findIndex()用法 3. 去重实战 方法二:reduce()去重 1. r ...
- es6方法 数组去重 多个数组去重 数组对象去重
1.单个数组的去重 Array.from(new Set(arr)) 2.多个数组去重 返回不同数据展示 let a = [1, 2, 3, 4] let b = [3, 4, 5] let unio ...
- JavaScript:数组对象去重的几种方法
数组对象去重 元素是对象类型的数组的去重我这粗分为两类,一类是当数组中整个元素一样时的去重(这里说的一样是指元素对象中的属性和值都一样),第二类是,元素对象中的某一个属性的值一样时进行去重 // 通用 ...
- vue js 数组对象去重方法
一.根据数组中唯一的值去重, cur原数组, next要添加的数据 this.warnSiteWords.push({one:this.valueUrl,two:this.valueName}); l ...
- android两个数组对象去重合并,JS 数组,数组对象的合并去重方法
此次对数组的操做,咱们使用es6的新语法来完成,因此在看下边代码以前,咱们要了解咱们下边要用到的es6中的set集合,和for...of 方法:javascript 首先介绍set集合: ES6提供了 ...
- js中给数组中对象去重
被问到如何给数组中对象去重,想到set答案肯定错误的,这个平时工作中用到的不多,查阅资料,找到给数组中对象去重的方法,利用对象属性名的唯一性,怪自己当时没想到. 方法一: let ary=[{id: ...
- js实现数组对象去重
数组对象去重,可直接复用 /***数组对象去重** @param {Array} arr 去重数组* @param {String} key 唯一标识*/ deduplication(arr, key ...
最新文章
- eclipse的jsp第一行代码报错_机器学习之AdaBoost算法及纯python代码手工实现
- 什么是设计模式(Design Patterns)
- angularjs directive scope变化为啥html,学习AngularJs:Directive指令用法(完整版)
- 【KERAS/直方图均衡化】图像数据集扩充
- 【今日CV 计算机视觉论文速览 第120期】Thu, 23 May 2019
- IIS启用GZip压缩
- 【Typecho插件-前端-播放器】BiliVid -- 好用的Bilibili视频链接解析播放器
- 照片放大模糊怎么变清晰,图片无损放大
- ffmpeg视频录制
- 刚开发的游戏《天黑请闭眼》
- 使用bert模型做句子分类
- 数据可视化和可视化分析:你能看到数据世界
- 盒子模型属性详解及案例
- matlab中plot矢量长度,关于plot函数矢量长度弹错的问题
- 关于显著性检验,有你想要的!
- Java 实现高并发秒杀
- Java顺序表就地逆置_顺序表的就地逆置问题
- 外观数列(Look-and-say sequence)
- 运放-1-理想运放与虚断虚短的来源
- 【数据库系统01】强制存取控制