一、数组对象去重
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 = true
for(let j=0; j<newArr.length; j++) {
if(arr[i][key] == newArr[j][key]) {
flag = false
break
}
}
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 = true
for(let j=0; j<newArr.length; j++) {
if(arr[i] == newArr[j]) {
flag = false
break
}
}
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]) {
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 = []
newArr = Array.from(new Set(arr))
console.log(newArr)
return newArr
}
参考文章 https://www.jb51.net/article/121410.htm
|