目前学习了基础的javascript,对数组去重进行了一部分总结,以下是总结的三个方法
方法一 利用双重for循环
let arr1 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
for (let i = 0; i < arr1.length; i++) {
let element1 = arr1[i]; //得到数组的第i个元素
//用i+1及之后的每一个元素与第i个元素进行比较,相同删除第i个元素,不同就保留
for (let j = i + 1; j < arr1.length; j++) {
let element2 = arr1[j];
if (element2 === element1) {
arr1.splice(j, 1);
j--;
}
}
}
console.log(arr1); //[1, 3, '3', {…}, {…}, NaN, NaN, undefined, null]
let arr2 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
for (let i = 0; i < arr2.length; i++) {
let element1 = arr2[i]; //得到数组的第i个元素
//用i+1及之后的每一个元素与第i个元素进行比较,相同删除第i个元素,不同就保留
for (let j = i + 1; j < arr2.length; j++) {
let element2 = arr2[j];
if (element2 == element1) {
arr2.splice(j, 1);
j--;
}
}
}
console.log(arr2); //[1, 3, {…}, {…}, NaN, NaN, undefined]
方法二 利用对象属性名的唯一性
let arr1 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
let obj = {};
let newArr = [];
for (let i = 0; i < arr1.length; i++) {
if (obj[arr1[i] + '']) {
obj[arr1[i] + '']++;
} else {
obj[arr1[i] + ''] = 1;
}
}
for (k in obj) {
newArr.push(k);
}
console.log(newArr); //['1', '3', '[object Object]', 'NaN', 'undefined', 'null']
//注,这种方法里原数组的元素会全部转化为字符串,且原数组中不能有{};
这种思想,我还用在了检查数组中出现元素的次数(对得到的对象进行for in 循环便可以得到出现次数最多或最少的数组元素),麻烦的是它最终得到的新数组完全由字符串组成
方法三 利用indexOf方法
function unique(arr) {
var newArr = [];
for (i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(unique([1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null]));
//[1, 3, '3', {…}, {…}, NaN, NaN, null, undefined]
//不能对重复的{},NaN去重
这种方法的代码量较少,但不能对重复的{},NaN去重
总结:使用这三种方法时,对于NaN不能去重,进行代码验证后,我得出了下列结果,任何一个NaN与另一个NaN都是不等的。NaN==NaN的结果永远是flase。