数组去重-简单数组,复杂数组

简单数组去重:

方法1:准备一个空数组res,如果res里面有arr的数据,就不添加到res里面了,如果res里面没有,就添加到res里面

var arr = [1, 2, 3, 2, 1, 2, 10, 3, 5, 4, 3, 2, 3, 4, 2, 1, 10]
var res = []
for (var i = 0; i < arr.length; i++) {
    if (res.indexOf(arr[i]) === -1) {
        res.push(arr[i])
    }
}
console.log(res)

方法2:遍历原始数据,arr[i]是数组中的每一个,从i+1向后开始检索,如果存在和arr[i]一样的数据,就把arr[i]删掉

var arr = [1, 2, 3, 2, 1, 2, 10, 3, 5, 4, 3, 2, 3, 4, 2, 1, 10]
for (var i = 0; i < arr.length; i++) {
    var index = arr.indexOf(arr[i], i + 1)
    if (index !== -1) {
        arr.splice(index, 1)
        i--
    }
}
console.log(arr);

方法3:还是遍历原数组,用arr[i]和i+1后面的数据比较,一样就删除,删除之后重新比较,就不用担心数组塌陷的问题了,因为是重新比较的

var arr = [1, 2, 3, 2, 1, 2, 10, 3, 5, 4, 3, 2, 3, 4, 2, 1, 10]
for (var i = 0; i < arr.length; i++) {
    var index = arr.indexOf(arr[i], i + 1)
    // 用while循环,和if不一样的是,if是复合条件执行一次,while是只要复合条件就一直执行,直到不符合条件为止
    while (index !== -1) {
        arr.splice(index, 1)
        // 删除完之后,重新将arr[i]和i+1后面的数据进行比较
        index = arr.indexOf(arr[i], i + 1)
    }
}
console.log(arr)

方法4:利用对象的key值不重名,把数组内的每一项当做key值使用(只适合数字数组)

var arr = [1, 2, 3, 2, 1, 2, 10, 3, 5, 4, 3, 2, 3, 4, 2, 1, 10]
// 准备一个空对象
var obj = {}
for (var i = 0; i < arr.length; i++) {
    // 把arr[i]当做obj的key值使用,因为涉及到变量和纯数字的关系,必须用数组关联语法
    obj[arr[i]] = '随便写点'
}
// 准备一个空数组
var res = []
for (var k in obj) {
    // k-0 是强制数据类型转换,因为出来的结果是每一项是字符串,如果想让每一项是数字,可以用k-0
    res.push(k - 0)
}
console.log(res)

// 简化:
var obj = {}
var res = []
for (var i = 0; i < arr.length; i++) obj[arr[i]] = '随便'
for (var k in obj) res.push(k)
console.log(res)

方法5:利用一个叫做Set的数据结构,Set数据结构是和数组差不多的数据类型,但是有一个天生的特质就是不接受重复的数据
语法:var s=new Set(数组)

var arr = [1, 2, 3, 2, 1, 2, 10, 3, 5, 4, 3, 2, 3, 4, 2, 1, 10]
var s=new Set(arr)
console.log(s) //得到的数据没有重复的数据,但是不是数组类型

// 需要把s转换成数组
方法1:
// 用Array.from()把数据转换成数组
var res=Array.from(s)
console.log(res)
// 简写
var res1=Array.from(new Set(arr))
console.log(res1)

方法2:
// 用展开运算符 `...` ,作用是把该数据类型展开, 里面的内容一个一个的拿出来
var res2=[...s]
console.log(res2)

复杂数组去重:

方法1:利用new Set()不接受重复数据

const arr = [
      { id: 1, name: 'ryuto' },
      { id: 2, name: 'yuta' },
      { id: 1, name: 'ryuto' }
];

var arrNew = [...new Set(arr.map(item => JSON.stringify(item)))].map(item => JSON.parse(item))
console.log('arrNew', arrNew);

方法2:利用reduce叠加,reduce的第一个参数是一个函数,第二个参数是初始值,函数的第一个参数是初始值,第二次是叠加的结果

const arr = [
    { id: 1, name: 'ryuto' },
    { id: 2, name: 'yuta' },
    { id: 1, name: 'ryuto' }
];

const arrNew = arr.reduce((prev, item) => {
    var exist = prev.find(i => i.id === item.id)
    if (!exist) {	
        prev.push(item)
    }
    return prev
}, [])
console.log('arrNew', arrNew);

方法3:使用filter和findIndex方法

const arr = [
    { id: 1, name: 'ryuto' },
    { id: 2, name: 'yuta' },
    { id: 1, name: 'ryuto' }
];
const arrNew = arr.filter((item, index) => {
    return arr.findIndex(obj => obj.id === item.id) === index;
});
console.log('arrNew', arrNew); 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值