文章

手撕-数组篇

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