性能逐渐递减
// 1
function distinct(a, b) {
let arr = a.concat(b)
let result = [] // 保存去重后的结果
let obj = {} // 利用对象属性唯一的特性来判断数组元素是否已经存在了
for (let i of arr) { // i就是数组的当前元素的值
if (!obj[i]) { // obj[i]表示获取obj的属性i的值,i就是数组的当前元素
result.push(i) //将去重后的元素保存在result新数组里
obj[i] = 1 // 将刚才得到的唯一的元素作为obj的属性名,并给其赋值,这样!obj[i]得到的值就是false,那么重复的值不会进入if判断
}
}
return result
}
// 2
function distinct(a, b) {
let arr = a.concat(b)
arr = arr.sort() // 先对合并后的数组进行排序
let result = [arr[0]] // 取出第一个元素,肯定是不重复的
for (let i=1, len=arr.length; i<len; i++) {
arr[i] !== arr[i-1] && result.push(arr[i]) // 判断如果和下一位不相等就push进新数组
}
return result
}
// 3
function distinct(a, b) {
// ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
// Set函数可以接受一个数组作为参数,用来初始化。
return Array.from(new Set([...a, ...b])) // new Set内的数据都是唯一的, Array.from将set实例对象转成真正的数组
}
// 4
function distinct(a, b) {
let arr = a.concat(b)
let result = [] // 创建新数组用来保存结果
for (let i of arr) {
// 数组的includes方法可以判断数组中是否已经包含了该元素
!result.includes(i) && result.push(i)
}
return result
}
// 5
function distinct(a, b) {
let arr = a.concat(b);
// filter()返回一个新数组,新数组中是所有通过callback函数测试的元素。是过滤后的元素。
return arr.filter((item, index)=> {
// indexOf方法返回第一次找到该元素的索引,如果该索引和当前索引相同就是第一次出现
return arr.indexOf(item) === index // 返回的是true or false ,如果是true,返回该元素item
})
}
// 6
function distinct(a, b) {
let arr = a.concat(b);
for (let i=0, len=arr.length; i<len; i++) {
for (let j=i+1; j<len; j++) {
// 将当前元素和下一个元素进行比较
if (arr[i] == arr[j]) { // 如果相等,就是重复元素
arr.splice(j, 1); // 从索引j开始删除,删除1个,就是索引j本身
// splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
len--;
j--;
}
}
}
return arr
}