数组去重(常考)
方法一(暴力)
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function deleteItem(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1)
j--
}
}
}
return arr
}
console.log(deleteItem(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法二
借助indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等
var ar = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function rep2(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) != i) {
arr.splice(i, 1); //删除数组元素后数组长度减1后面的元素前移
i--; //数组下标回退
}
}
return arr;
}
rep2(ar);
console.log(ar); //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法三
利用数组中的filter方法
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
let a = arr.filter(function(element, index, self) {
return self.indexOf(element) === index;
})
console.log(a) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法四
利用空对象来记录新数组中已经存储过的元素
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function re(arr) {
let obj = {}
let arr1 = []
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
arr1.push(arr[i])
obj[arr[i]] = true
}
}
return arr1
}
console.log(re(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法五
借助新数组 判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function re1(arr) {
let arr1 = []
for (let i = 0; i < arr.length; i++) {
if (arr1.indexOf(arr[i]) == -1) {
arr1.push(arr[i])
}
}
return arr1
}
console.log(re1(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
去重的方法很多,这里列举具有代表性的几个
一、将字符串反向 ‘abc123’ => ‘321cba’
第一种:利用for循环
let str = "abc"
let str1 = ""
for (let i = 0; i < str.length; i++) {
str1 += str.charAt(str.length - 1 - i)
}
console.log(str1) //cba
第二种 :利用数组的reverse
let str = "abc123"
console.log(str.split("").reverse().join("")) //321cba
二、打平嵌套数组 [1, [2, [3], 4], 5] => [1, 2, 3, 4, 5]
let arr = [1, [2, [3], 4], 5]
console.log(arr.toString().split(",").map(item => Number(item))) //[ 1, 2, 3, 4, 5 ]
const arr = [1, [2, [3], 4], 5]
console.log(JSON.parse(`[${arr}]`)) //[ 1, 2, 3, 4, 5 ]
三、打印数组全排列
[1,2,3] => [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
function allRange(arr, path, res) {
if (!arr.length) {
res.push(path)
return
}
arr.forEach((v, idx) => {
const t = arr.slice()
const p = path.slice()
t.splice(idx, 1)
p.push(v)
allRange(t, p, res)
})
}
var a = [1, 2, 3, 4]
const b = []
allRange(a, [], b)
console.log(b)
四、寻找两个有序数组最小相同元素
游标法
const a = [1, 2, 5, 9, 10]
const b = [2, 3, 4, 6, 9, 10]
function finmix(arr1, arr2) {
let i = 0;
let j = 0;
while (i < arr1.length || j < arr2.length) {
if (arr1[i] < arr2[j]) {
i++
} else if (arr1[i] > arr2[j]) {
j++
} else {
return arr1[i]
}
}
}
console.log(finmix(a, b)) //2
五、有序二维数组寻找某元素坐标
const data = [
[1, 2, 5, 9, 10],
[12, 22, 35, 49, 51],
[61, 62, 75, 79, 81]
]
function finIndex(arr, target) {
let i = 0;
let j = arr[i].length - 1
while (i < arr.length && j >= 0) {
if (target > arr[i][j]) { i++ } else if (target < arr[i][j]) {
j--;
} else { return [i, j] }
}
return false
}
console.log(finIndex(data, 81)) //[2,4]
六、 数组的创建
//字面量
let a=[1,2,3]
//构造函数
let arr=new Array(1,2,3)
let arr1=new Array(3)
七、Array 对象属性
//constructor 返回对创建此对象的数组函数的引用。
//length 设置或返回数组中元素的数目。(比较常用)
//prototype 使您有能力向对象添加属性和方法。
let arr = [1, 3]
let arr1 = new Array(1, 2, 3)
console.log(arr.constructor) //[Function: Array]
console.log(arr1.constructor) //[Function: Array]