JavaScript 数组去重、扁平化实际应用

1.数组去重

利用set

1
2
3
var arr = [1,2,3,2,9]
var newarr = [...new Set(arr)]
console.log(newarr);//[1, 2, 3, 9]

利用indexOf

1
2
3
4
5
6
7
8
9
10
11
var arr = [1,2,3,2,9]
function fn(arr){
var newarr = []
arr.filter((item,index)=>{
if(newarr.indexOf(item)==-1){
newarr.push(item)
}
})
return newarr
}
console.log(fn(arr));//[1, 2, 3, 9]

利用includes

1
2
3
4
5
6
7
8
9
10
11
var arr=[1,2,3,2,9]
function fn(arr){
var newarr=[]
arr.filter((item,index)=>{
if(!newarr.includes(item)){
newarr.push(item)
}
})
return newarr
}
console.log(fn(arr));

利用reduce

1
2
3
4
5
6
7
8
9
10
11
12
13
var arr=[1,2,3,2,9]
function fn(arr){
var newarr=[]
arr.sort().reduce((pre,value,index)=>{
//比较pre中最后一个元素和当前的值是否相等,不相等加入新数组
if (pre[index-1]!==value) {
newarr.push(value)
}
return newarr
},[])
return newarr
}
console.log(fn(arr));

2.数组扁平化

利用flat

注意此api不传参数就只能深度到1,参数代表着深度,当不知道深度时可以传Infinity

1
2
3
4
var arr=[1,2,3,2,9,[2,3,[1]]]
console.log(arr.flat());//[1, 2, 3, 2, 9, 2, 3, Array(1)]
var arr=[1,2,3,2,9,[2,3,[1]]]
console.log(arr.flat(Infinity));//[1, 2, 3, 2, 9, 2, 3, 1]

flat函数会默认将原数组中的空值删除,演示效果如下

1
2
let a = [1,2,,3,4,,6]
console.log(a.flat()); // [1, 2, 3, 4, 6]

利用reduce

1
2
3
4
5
6
7
var arr=[1,2,3,2,9,[2,3,[1]]]
function flat(arr){
return arr.reduce((pre,value,index)=>{
return pre.concat(Array.isArray(value)?flat(value):value)
},[])
}
console.log(flat(arr));//[1, 2, 3, 2, 9, 2, 3, 1]

使用map递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let arr = [1,2,3,[9,3,4,[5,6,78]]]

function flat_map(arr4) {
let newarr = []
arr.map(item =>{
if (Array.isArray(item)){
newarr = newarr.concat(flat_map(item))
} else {
newarr.push(item)
}
})
return newarr
}

flat_map(arr)

将数组转为字符串,再转为数组

1
2
3
4
5
6
var arr=[1,2,3,2,9,[2,3,[1]],[2,3]]
//数组转为字符串,再将字符串转为数组
var newarr = arr.join(',').split(',').map((item,index)=>{
return parseInt(item)
})
console.log(newarr);//[1, 2, 3, 2, 9, 2, 3, 1, 2, 3]

备注: 这里的join改成toString,parseInt改成Number也是一种方法

使用扩展运算符

1
2
3
4
5
6
7
8
let arr = [1,2,3,[9,3,4,[5,6,78]]]
function flat_concat(arr6) {
while (arr.some(item =>Array.isArray(item))){
arr = [].concat(...arr4)
}
return arr
}
flat_concat(arr)

数组应用

1.判断数组元素出现个数

例如:var arr=[‘name’,’age’,’hhh’,’hhh’]各出现多少次

1
2
3
4
5
6
7
8
9
10
var arr=['name','age','hhh','hhh']
var newarr = arr.reduce((pre,item,index)=>{
if (!pre[item]) {
pre[item]=1
}else{
pre[item]++
}
return pre
},{})
console.log(newarr);

2.判断数组中出现次数最多的元素

在统计个元素出现个数的基础上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var arr=['name','age','hhh','hhh']
var newarr = arr.reduce((pre,item,index)=>{
if (!pre[item]) {
pre[item]=1
}else{
pre[item]++
}
return pre
},{})
var max=0//最多的数量
var attr//最多的属性是什么
for (const key in newarr) {
//key为属性
console.log(newarr[key]);
if (newarr[key]>max) {
max=newarr[key]
attr=key
}
}
console.log(max,attr);

3.统计数组中重复的元素

1
2
3
4
5
6
7
var arr=[1,2,6,2,9,1]
console.log(arr.sort());
var arr2=[]
arr.sort().sort((e1,e2)=>{
e1===e2?arr2.push(e2):''
})
console.log(arr2);

4.在a不在b

现在两个数组,判断在a中的元素,不在b中
const a = [1,2,3,5]
const b=[1,3,5,6]

1
2
3
4
5
6
7
const a = [1,2,3,5]
const b=[1,3,5,6]
const newarr = a.filter((item,index)=>{
//将在a不在b中的筛选出来
return b.indexOf(item)==-1
})
console.log(newarr);

综合题

公司前后招聘了10个员工(性别,年龄, 月薪各不相同),有以下需求
1). 列表显示所有员工的所有信息
2). 对员工进行年薪降序列表显示
3). 得到男员工的总月薪
4). 查找一个月薪只比12000高一点点的员工
5). 查找出所有月薪高于12000的员工

1
2
3
4
5
6
7
8
9
10
11
12
const employees = [
{name: 'A', sex: '男', age: 21, salary: 10000},
{name: 'B', sex: '女', age: 25, salary: 12000},
{name: 'C', sex: '男', age: 24, salary: 13000},
{name: 'D', sex: '男', age: 24, salary: 12500},
{name: 'E', sex: '女', age: 21, salary: 14000},
{name: 'F', sex: '男', age: 24, salary: 16000},
{name: 'G', sex: '男', age: 23, salary: 9000},
{name: 'H', sex: '女', age: 21, salary: 11000},
{name: 'I', sex: '男', age: 23, salary: 13200},
{name: 'J', sex: '男', age: 23, salary: 15000}
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1)employees.forEach((item,index)=>{
console.log(item);
})

2)var newArr= employees.sort((e1,e2)=>{
return e2.salary-e1.salary
})
console.log(newArr);

3)var newArr= employees.reduce((pre,item)=>{
return pre = item.sex==='男'?pre+item.salary:0
},0)
console.log(newArr);

4)var newArr= employees.sort((e1,e2)=>{
return e1.salary-e2.salary
}).find((item,index)=>{
return item.salary>12000
})
console.log(newArr);

5)var newArr = employees.filter((item,index)=>{
return item.salary>12000
})
console.log(newArr);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!