总结前端面试JS常用的数组操作,如扁平化数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等。。。
一、扁平化数组
开始篇
function flatten(arr){
while(arr.some(item=>Array.isArray(item))){
arr = [].concat(...arr)
}
return arr;
}
flatten([1,2,[3,4,[5]]]) //[ 1, 2, 3, 4, 5 ]
实质是利用递归和数组合并方法concat实现扁平。
终结篇
[1,2,[3,4,[5]]].flat(1) //[ 1, 2, 3, 4, [ 5 ] ]
[1,2,[3,4,[5]]].flat(Infinity) //[ 1, 2, 3, 4, 5 ]
二、去重
开始篇
Array.prototype.distinct = function(){
const arr = this;
const len = arr.length;
const result = [];
for(let i =0;i<len;i++){
for(j=i+1 ; j<len ; j++){
if(arr[i]===arr[j]){
j = ++i;
}
}
result.push(arr[i])
}
return result;
}
[1,2,3,3,3,4,4,5].distinct() //[ 1, 2, 3, 4, 5 ]
终结篇
[...new Set([1,2,2,3,4,4])]
Array.from(new Set([1,2,2,3,4,4]))
三、排序
开始篇:
- 冒泡排序:
Array.prototype.bubleSort= function(){
const arr = this;
const len = arr.length;
for(let i=0;i<len-1;i++){
for(let j=0;j<len-1-i;j++){
if(arr[j]>arr[j+1]){
let temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
[8,5,7,2].bubleSort() //[ 2, 5, 7, 8 ]
另一种冒泡排序:
Array.prototype.bubleSort= function(){
const arr = this;
const len = arr.length;
for(let i=len;i>1;i--){
for(let j=0;j<len-1;j++){
if(arr[j]>arr[j+1]){
[arr[j],arr[j+1]]=[arr[j+1],arr[j]]
}
}
}
return arr;
}
[8,5,7,2].bubleSort() //[ 2, 5, 7, 8 ]
- 选择排序
Array.prototype.selectSort = function(){
const arr = this;
const len = arr.length;
for(let i=0;i<len-1;i++){
for(let j=i+1;j < len;j++){
if (arr[i]>arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
return arr
}
[5,1,2,7,4].selectSort() //[ 1, 2, 4, 5, 7 ]
终结篇
[1,5,2,3].sort() //[ 1, 2, 3, 5 ] 默认是升序
[1,5,2,3].sort((a,b)=>b-a) //[ 5, 3, 2, 1 ]
四、最大值
开始篇
先排序,再取值
Array.prototype.selectSort = function(){
const arr = this;
const len = arr.length;
for(let i=0;i<len;i++){
for(let j =i+1;j<len;j++){
if(arr[i]>arr[j]){
[arr[i],arr[j]]=[arr[j],arr[i]]
}
}
}
return arr;
}
maxArray = function(array){
const len = array.length;
return array.selectSort()[len-1]
}
maxArray([1,3,9,2,5]) //9
终结篇
Math.max(...[1,2,3,4]) //4
Math.max.apply(this,[1,2,3,4]) //4
[1,2,3,4].reduce((prev,cur)=>{
return Math.max(prev,cur)
},0) //4
五、求和
开始篇
function sum(arr){
const len = arr.length;
if(len===0){
return 0
}else if(len===1){
return arr[0]
}else {
return arr[0] + sum(arr.slice(1))
}
}
sum([1,2,3,4])
利用slice截取数组,再递归求和
终结篇
[1,2,3,4].reduce((a,b)=> a+b) //10
六、合并
开始篇
[1,2,3,4].concat([5,6]) //[ 1, 2, 3, 4, 5, 6 ]
[...[1,2,3,4],...[5,6]] //[ 1, 2, 3, 4, 5, 6 ]
七、判断是否包含值
开始篇
[1,2,3].some(item=>{
return item===3
})
终结篇
[1,2,3].indexOf(3) //2 如果存在返回索引,不存在返回-1
[1,2,3].includes(3) //true
[1,2,4,4,3].find(item=>item===3) //3 返回本身,如果不存在返回undefined
[1,2,4,4,3].findIndex(item=>item===3) //4 返回索引,如果不存在返回-1
八、类数组转化
终结篇
Array.from(new Set([1,2,3,4])) //[nodemon] starting `node z.js`
[ 1, 2, 3, 4 ]
开始篇
九、每一项设置值
开始篇
[1,2,3].map(()=>0) //[ 0, 0, 0 ]
终结篇
[1,2,3].fill('a') //[ 'a', 'a', 'a' ]
十、每一项是否满足
[1,2,3].every(item=>item >2) //false
十一、有一项满足
[1,2,3].some(item=>item>2) //true
十二、过滤数组
[1,2,3].filter(item=>item>2) //[3]
十三、对象和数组转化
Object.keys({name:'张三',age:14}) //[ 'name', 'age' ]
Object.values({name:'张三',age:14}) //[ '张三', 14 ]
Object.entries({name:'张三',age:14}) //[ [ 'name', '张三' ], [ 'age', 14 ] ]