手撕-数组篇
1.数组展平
flat https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
let arr=[1,2,[3,4],[5,[6,[7,[8]]]],[9]]
let arr1=arr.flat()
// 模拟flat
Array.prototype.flattest1=function flatTest(n){
if(n<=0) return this;
let ans=[];
for(let i=0;i<this.length;i++){
if(typeof this[i] !== 'object'){
ans.push(this[i])
}else{
ans.push(...this[i].flattest1(n-1))
}
}
return ans;
}
console.log(arr.flattest1(2))
//手写1 拓展运算符+push
let arr=[1,2,[3,4],[5,[6,[7,[8]]]],[9]]
function flat(arr,n){
if(!Array.isArray(arr))
throw new Error('NOT ARRAY')
if(n<=0) return arr;
let ans=[]
for(let item of arr){
if(typeof item !== 'object'){
ans.push(item)
}else{
ans.push(...flat(item,n-1))
}
}
return ans
}
console.log(flat(arr,2))
console.log(arr.flat(2))
//手写2 reduce + concat
console.time()
let arr=[1,2,[3,4],[5,[6,[7,[8]]]],[9]]
function flat(arr,n){
if(!Array.isArray(arr))
throw Error('not array')
if(n<=0) return arr;
let ans=[];
return arr.reduce((pre,curr)=>{ //reduce 返回一个新数组
if(Array.isArray(curr)){
return pre.concat(flat(curr,n-1)) //concat 返回新数组,且不需要拓展运算符
}else{
return pre.concat(curr)
}
},ans)
}
console.log(flat(arr,2))
console.timeEnd(); //default: 0.302978515625 ms
//手写3 reduce + push
console.time()
let arr=[1,2,[3,4],[5,[6,[7,[8]]]],[9]]
function flat(arr,n){
if(!Array.isArray(arr))
throw Error('not array')
if(n<=0) return arr;
let ans=[];
return arr.reduce((pre,curr)=>{
if(Array.isArray(curr)){
pre.push(...flat(curr,n-1))
}else{
pre.push(curr)
}
return pre //push 改变原数组,所以可以单独返回pre
},ans)
}
console.log(flat(arr,2))
console.timeEnd();
// default: 0.285888671875 ms
2.数组去重
set: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set
//1. Set + Array.from
let arr=[1,2,3,3,4,5,6,1,2,7,9,6,2]
console.log(Array.from(new Set(arr))) //注意还需要Array.from 带length属性
//2. {}+hasOwnProperty
let arr=[1,2,3,3,4,5,6,1,2,7,9,6,2]
let uniqueArray=(arr)=>{
let map={};
let ans=[];
for(let item of arr){
if(!map.hasOwnProperty(item)){
map[item]=true;
ans.push(item)
}
}
return ans;
}
console.log(uniqueArray(arr))
3.数组排序
//给定一个二维数组[[20,5],[30,20],[30,5],[10,20]],我们记一维数组两个值表示分别为X,Y,要求对数组排序//排序规则为:优先级先按x排序,如果x值大小一样,按大小排序
// 排序顺序:从小到大
//结果:[[10,20],[20,5],[30,51,[30,20]]
const twoDimensionalArray =[[20,5],[30,20],[30,5],[10,20]]
function sortArr(arr2){
/**
* code here
*/
return arr2.toSorted((a,b)=>{ // toSorted 不改变原数组,但是似乎node 16 不支持。
if(a[0]===b[0])
return a[1]-b[1]
else {
return a[0]-b[0]
}
})
}
console.log(sortArr(twoDimensionalArray));
// 简写 解构 + ||
console.log(twoDimensionalArray.sort(([ax,ay],[bx,by])=> (ax-bx) || (ay-by)))
License:
CC BY 4.0