数组扁平化
1.在ES6新增特性中,有一个方法flat(),可以实现数组的扁平化
但是有一点就是,如果嵌套的数组内只有一个元素,无法将其完全扁平出来,而是展示为数组的方式
let list = [1,2,[3,4,[5]]]
let newList = list.flat()
console.log(newList)//[1, 2, 3, 4, Array(1)]
2.常用的forEach方式结合递归实现数组扁平化
function myFlat(list){
let arr = []
list.forEach(item=>{
//判断数组没得数据是否为数组
if(typeof item==='object'&&item instanceof Array){
// arr = arr.concat(myFlat(item))
myFlat(item)
}
else{
arr.push(item)
}
})
return arr
}
3.通过reduce的方式结合递归实现数组扁平化
function myFlat1(list){
return list.reduce((acc,cur)=>{
if(Array.isArray(cur)){
return acc.concat(myFlat1(cur))
}
else{
return acc.concat(cur)
}
},[])
}
数组扁平化的操作,主要就是通过递归的方式实现的 看到其他博主写的一个比较好的一种方式,可以控制扁平的深度
let arr = [1, [2, 3], [4, [5, 6, [7, 8]]]];
function flatten(arr, depth) {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i]) && depth > 0) {
result = result.concat(flatten(arr[i], depth - 1));
} else {
result.push(arr[i]);
}
}
return result;
}
console.log(flatten(arr, 1)); // [ 1, 2, 3, 4, [ 5, 6, [ 7, 8 ] ] ]
console.log(flatten(arr, 2)); // [ 1, 2, 3, 4, 5, 6, [ 7, 8 ] ]
console.log(flatten(arr, 3)); // [ 1, 2, 3, 4, 5, 6, 7, 8 ]
其核心在于方法中传递了一个depth参数,通过depth控制递归的深度,从而控制扁平化的程度
数组去重
一般数组去重
1.通过两个for循环进行去重操作,也是最常规的一种方法
for (let i = 0; i < arr.length; i++) {
let item=arr[i]
for (let j = i+1; j < arr.length; j++) {
if(item===arr[j]){
arr.splice(j,1)
j--
}
}
}
2.通过一个for循环和一个空数组进行去重,说白了就是空间换时间
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
// 等于-1没有找到,这个时候需要将其存入新的数组
if(newarr.indexOf(item)==-1){
newarr.push(item)
}
}
3.通过Set数据结构快速实现去重操作
console.log([...new Set(arr)])
对象数组去重
4.数组对象的去重操作
arrObj = [
{ id: 1, name: 'Bill', age: 20 },
{ id: 2, name: 'Lucy', age: 18 },
{ id: 1, name: 'Bill', age: 20 },
{ id: 3, name: 'Jack', age: 21 },
{ id: 3, name: 'Jack', age: 21 },
];
const listObj = arrObj.reduce((result,cur)=>{
const ids = result.map(item=>item.id)
if(!ids.includes(cur.id)){
result.push(cur)
}
return result
},[])
console.log(listObj)
输出结果