JavaScripit 数组常用方法

70 阅读4分钟

1.数组去重

方式1;new Set

var arr1 = [1,2,3,2,4,1]
console.log(Array.from(new Set(arr1)))
console.log([…new Set(arr1)])

方式2:indexOf

function unique(arr){
    var brr = []
    for (var I = 0;i<arr.length:i++){
        if (brr.indexOf(arr[i]) == -1){
            brr.push(arr[i])
        }
    }
    return brr
}

方式3

function unique(arr){
    arr = arr.sort()
    var brr = [[arr[0]]]
    for (var I = 1;i<arr.length:i++){
        if (arr[i] !== arr[i-1] ){
            brr.push(arr[i])
        }
    }
    return brr
}

找出多维数组最大值

function fnArray(arr){
    var newArr = []
    arr.forEach((item,index) =>{
        newArr.push(Math.max(…item))
    })
    return newArr
}

console.log(fnArr([
 [4,5,1,3], [13,27,18,26], [32,35,37,39], [1000,1001,857,1],
]))

如何自定义实现unshit

Array.prototype.myUnshit = function (){
    const len = arguments.length
    for (let i = len -1 ; i >=0;i--){
        const element = arguments[i]
        this.splice(0,0,element)
    }
    return this.lenth
}

let arr = [1,2,3]
console.log(arr.myUnshit(3,2,1),arr)

如何实现数组的随机排序

var arr = [1,2,3,4,5,6,7,8,9,10]

function result(arr) {
    for (let i = 0;i < arr.lenth;i++){
        let randomIndex = parseInt(Math.random() * arr.length)
        
        // 存下当前正常索引值的对应数字
        let curNum = arr[i]
        arr[i] = arr[randomIndex]
        arr[randomIndex] = curNum
    }
    return arr
}
arr.sort(() => Math.random - 0.5)

如何使用迭代的方法实现flattern函数

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

const flatten = function (arr) {
    while (arr.some(v => Array.isArray(v))){
        arr = [].concat(...arr)
    }
    return arr
}

const flatten = function (arr) {
    return [].concat(...arr.map(v => (Array.isArray(v) ? flatten(v) : v)))
}

两数之和

const nums = [2,7,11,15]
const target = 9

function twoSum(nums,target){
    for (let i = 0;i < nums.length;i++){
        const num = nums[i];
        const targetIndex = nums.indexof(taget - num)
        if (targetIndex > -1 && targetIndex !== i){
            return [i,targetIndex]
        }
    }
}
console.log(twoSum(nums,target))

sort背后原理是什么

sort()方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串Unicode码点。

array.sort(sortBy);参数sortBy可选。规定排序顺序。必须是函数。

注:如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说的更精准点,是按照编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较

V8引擎sort函数只给出了两种排序 InsertionSort 和 QuickSort,数量小于10的数组使用 InsertionSort,比10大的数组则使用QuickSort

之前的版本是:插入排序和快排,现在是冒泡

给字符串新增方法实现功能

String.prototype.addPrefix = function(str){
    return str + this
}
Console.log('world'.addPrefix('hello'))

找出字符串出现最多次数的字符

var str = 'aaabbbbbccdddddddddd'
var obj = {}
for (var I =0;i < str.length;i++){
    var char = str.charAt(i)
    if (obj[char]){
        obj[char]++
    }else {
         obj[char] = 1
    }
}
console.log(obj)
// 统计出来的最大值
var max = 0
var maxChar = ''
for (var key in obj) {
    if (max < obj[key]){
        max = obj[key]
        maxChar = key
    }
}

slice是干嘛的,splice是否会改变原数组

  1. slice是来截取的,返回的是一个新的数组;参数可以写slice(3),slice(1,3),slice(-3)
  2. splice 功能有:插入、删除、替换;返回的是:删除的元素,会改变原数组

find和filter区别

  • 区别一:返回的内容不同

filter 返回时新数组,不改变原素组

find 返回具体的内容,匹配的是第一个满足条件的结果,不改变原数组

  • 区别二:

find :匹配的是第一个满足条件的结果

filter:返回整体(每一个匹配到都返回)


let arr = [123,13,13,1,31,1,2,4]

console.log(arr.filter(val =>{return val > 2})) // [123,13,13,31,4]

console.log(arr.find(val =>{return val > 2})) // 123

some和every的区别

some : 如果有一项匹配则返回true

every:全部匹配才会返回true

var arr = [1,4,2,10,6]
var brr =  arr.some(val = {
    return val > 4
})
var crr =  arr.every(val = {
    return val > 4
})
console.log(brr,crr) // true,false

手动实现发布订阅

class EventEmitter {
    handlers = {}
    
    on(type,handlers,once = false){
        if(!this.handlers[type]){
            this.handlers[type] = []
        }
        if(!this.handlers[type].includes(handler)){
            this.handlers[type].push(handler)
            handler.once = once
        }
    }
    once(type,handler){
        this.on(type,handler,true)
    }
    off(type,handler){
        if(this.handlers[type]){
            this.handlers[type] = this.handlers[type].filter(h => {
            return h != handler
            })
        }
    }
    trigger(type){
        if (this.handlers[type]){
            this.handlers[type].forEach(handler =>{
                handler.call(this);
                if (handler.once){
                    this.off(type,handler)
                }
            })
        }
    }
}

const ev = EventEmitter()

function handler1(){
    console.log('handler1')
}
function handler2(){
    console.log('handler2')
}

function handler3(){
    console.log('handler3')
}

ev.on('test',handler1)
ev.once('test',handler2)
ev.on('test',handler3)

ev.trigger('test')
ev.trigger('test')

打印100以内的质数如何实现

质数 :只能被1和自身整除

var count = 0
for (let i = 2;i <= 100;i++){
    for (let j = 1;j<= i;j++){
        if (i %j === 0){
            count++
        }
    }
    // 从1开始,到自身都被%完,1 自身整除 count === 2
    if (count === 2){
        console.log(i)
    }
    count = 0
}

如何提URL中的参数

let url = 'https://alibaba.com?a=1&b=2&c=3#hash'

function queryURLParams(URL){
    let url = URL.split('?')[1]
    const urlSearchParams = new URLSearchParams(url)
    const params = Object.fromEntries(urlSearchParams.entries())
    
    return params;
}
console.log(queryURLParams(url))

如何获取范围内的指定随机数

Math.round(num) // 四舍五入
Math.floor(num) // 向下取整
Math.ceil(num) // 向上取整

function fn(min,max){
    return Math.floor(Math.random() * (max - min) + min)
}

闭包

JS防抖

应用场景:输入框搜索,按钮的重复点击,上拉滚动加载,用户的缩放事件

工作原理:当事件触发时并不会立即执行回调,而是会等待一段时间 如果在等待时间再次触发事件,会继续等待 只有等待期间无新的事件触发才会执行回调

const debounce = (fn,delay) => {
    let timeout;
    return () =>{
        if (timeout) clearTimeout(timeout)
        timeout = setTimout(() => {
            fn()
        },delay)
    }
}

JS截流

应用场景:下拉刷新、鼠标移动、拖拽组件

const throttle = (fn,wait) = {
    let lastCallTime = 0
    const throttled = function(...arg){
        const now = Date.now()
        if (now - lastCallTime >= wait){
            fn.call(this,...arg);
            lastCallTime = now
        }
    }
    return throttled
}