https://blog.csdn.net/Marker__/article/details/105230882
第i个元素和i之后的元素做比较,不重复则添加进新的数组
Array.prototype.unique = function() {
const newArray = []; //要返回出的新数组
let isRepeat; //当前元素是否重复
let oldArrayLength = this.length;
for (let i = 0; i < oldArrayLength; i++) {
isRepeat=false;
for (let j = i + 1; j < oldArrayLength; j++) {
if (this[i] == this[j]) {
isRepeat = true;
break;
}
}
if (!isRepeat) {
newArray.push(this[i]);
}
}
return newArray;
}
console.log([1, 1, 2, 1, 3, 4, 5, 4].unique()) //[2, 1, 3, 5, 4]
Array.prototype.unique = function () {
return this.filter((item, index) => {
return this.indexOf(item) === index; //数组中每个元素的位置(index)和其第一次出现的下标(indexof)对应
})
}
console.log([1,1,2,1,3,4,5,4].unique()); // [1, 2, 3, 4, 5]
var ages = [32, 33, 16, 40];
function checkAdult(age) {
return age >= 18;
}
function myFunction() {
document.getElementById("demo").innerHTML = ages.filter(checkAdult);
}
Array.prototype.unique = function() {
const newArray = [];
this.forEach(item => {
if (newArray.indexOf(item) === -1) { //如果新数组中不含有当前元素,就push
newArray.push(item);
}
});
return newArray;
}
console.log([1, 1, 2, 1, 3, 4, 5, 4].unique()); //[1,2,3,4]
上述的这两种方法输出的数组副本,不会将原数组中的元素出现位置打乱,业界俗称:稳定。
Array.prototype.unique = function () {
const newArray = [];
this.sort(); //排序
for (let i = 0; i < this.length; i++) { //对排序数组进行遍历
if (this[i] !== this[i + 1]) { //当前元素和后面的元素不相同就push
newArray.push(this[i]);
}
}
return newArray;
}
Array.prototype.unique = function () {
const newArray = [];
this.sort(); //排序
for (let i = 0; i < this.length; i++) {
if (this[i] !== newArray[newArray.length - 1]) { //和新数组的最后一个元素比较
newArray.push(this[i]);
}
}
return newArray;
}
上述的这两种方法由于都用到 sort() 方法, 会打乱原有数组的顺序,所以:不稳定
Array.prototype.unique = function () {
const newArray = [];
this.forEach(item => {
if (!newArray.includes(item)) { //如果新数组中含有当前元素,就说明是重复值
newArray.push(item);
}
});
return newArray;
}
console.log([1,1,2,1,3,4,5,4].unique()); //[1,2,3,4] 稳定
Array.prototype.unique = function () {
return this.sort().reduce((init, current) => {
if(init.length === 0 || init[init.length - 1] !== current){ //类似于3.2方法
init.push(current);
}
return init;
}, []);
} //只要涉及到 sort 方法,就是不稳定的
function unique(arr) {
let hashMap = new Map(); //创建一个新的Map对象
let result = new Array(); // 数组用于返回结果
for (let i = 0; i < arr.length; i++) {
if(hashMap.has(arr[i])) { // 判断 hashMap 中是否已有该 key 值
hashMap.set(arr[i], true); // 后面的true 代表该 key 值在原始数组中重复了,false反之
} else { // 如果 hashMap 中没有该 key 值,添加
hashMap.set(arr[i], false);
result.push(arr[i]);
}
}
return result;
}
console.log(unique([1, 1, 1, 2, 3, 3, 4, 5, 5, "a", "b", "a"])); // [ 1, 2, 3, 4, 5, 'a', 'b' ]
Set 对象允许你存储任何类型的 唯一值,无论是原始值或者是对象引用,该方法天生就适合数组去重。
NaN 和 undefined 都可以被存储在 Set 中, NaN 之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)
Array.prototype.unique = function () {
const set = new Set(this); //new 一个 Set 对象,将数组作为参数传递进去
return Array.from(set); //自动实现去重,Array.from() 将其转化为数组
} //可以通过 set.add(args) 添加元素
console.log([1,1,2,1,3,4,5,4].unique()); //[1,2,3,4] 稳定
Array.prototype.unique = function () {
return [...new Set(this)]; //简化上述步骤
}
console.log([1,1,2,1,3,4,5,4].unique()); //[1,2,3,4] 稳定