数组去重
数组1
let arr = [1, 2, 3, 3, 4, 5, 5, 6, 6, 6]
方法1:
const res = new Map()
return arr.filter(a => !res.has(a) && res.set(a, 1))
方法2:
return Array.from(new Set(arr))
方法3:
return […new Set(arr)]
数组2(有键值对)
let arr1 = [
{ id: ‘1’, name: ‘张三’ },
{ id: ‘2’, name: ‘张三’ },
{ id: ‘2’, name: ‘李四’ },
{ id: ‘4’, name: ‘王五’ },
{ id: ‘1’, name: ‘张三’ },
{ id: ‘2’, name: ‘李四’ },
{ id: ‘3’, name: ‘王五’ },
{ id: ‘4’, name: ‘赵六’ }
]
方法1:
const res = new Map()
return arr.filter(a => !res.has(a.name) && res.set(a.name, 1))
方法2:利用对象访问属性的方法,判断对象中是否存在key:
var result = []
var obj = {}
for (var i = 0; i < newArr.length; i++) {
if (!obj[newArr[i].name]) {
result.push(newArr[i])
obj[newArr[i].name] = true
}
}
console.log(result)
方法3:利用reduce方法遍历数组,reduce第一个参数是遍历需要执行的函数,第二个参数是item的初始值
var obj = {}
newArr = newArr.reduce(function(item, next) {
obj[next.name] ? ‘’ : (obj[next.name] = true && item.push(next))
return item
}, [])
console.log(newArr)
两个数组 求并集、交集、差集
let a = [1, 2, 3, 6]
let b = [2, 4, 5, 6, 8]*方法1:ES7新增了一个Array.prototype.includes的数组方法,用于返回一个数组是否包含指定元素,结合filter方法
*
// 并集
return a.concat(b.filter(v=>!a.includes(v)))
// 交集
return a.filter(v=>b.includes(v)) //[2,6]
// 差集
return a.concat(b).filter(v=>!a.includes(v)||!b.includes(v))
*
方法2:ES6中新增的一个Array.from方法,用于将类数组对象和可遍历对象转化为数组。只要类数组有length长度,基本都可以转化为数组。结合Set结构实现数学集求解。。
*
let aSet = new Set(a)
let bSet = new Set(b)
// 并集
let union = Array.from(new Set(a.concat(b)))
// 交集
let intersection = Array.from(new Set(a.filter(v => bSet.has(v))))
// 差集
let difference = Array.from(new Set(a.concat(b).filter(v => !aSet.has(v) || !bSet.has(v))))
*
方法3:ES5可以利用filter和indexOf进行数学集操作,但是,由于indexOf方法中NaN永远返回-1,所以需要进行兼容处理。
*
// 并集
return a.concat(b.filter(v => a.indexOf(v) === -1))
// 交集
return a.filter(v => b.indexOf(v) > -1)
// 差集
return a.filter(v => b.indexOf(v) === -1).concat(b.filter(v =>
a.indexOf(v) === -1))
补充:两个数组对象 =>差集
let arr1 = [
{ name: ‘张三’ },
{ name: ‘李四’ },
{ name: ‘王五’ }
]
let arr2 = [
{ name: ‘王五’ },
{ name: ‘张三’ }
]
let arr3 = arr1.filter(v => {
return arr2.every(e => e.name!== v.name)
})
//[{name:‘李四’}]