描述:將嵌套多層的數組展開平鋪成只有一層的數組。正則表達式
let array = [1, [1, 2, 3], [1, [2, {}]] ] handle(array) // [1, 1, 2, 3, 1, 2, {}]
方法一:數組
const handle = array => JSON.parse(`[${JSON.stringify(array).replace(/\[|]/g,'')}]`) handle(array) // [ 1, 1, 2, 3, 1, 2, {} ]
知識點:JSON.parse()/JSON.stringify()
、String.prototype.replace()
app
方法二:ide
const handle = array => array.reduce((accumulator, currentValue) => accumulator.concat(Array.isArray(currentValue) ? handle(currentValue): currentValue), []) handle(array) // [ 1, 1, 2, 3, 1, 2, {} ]
知識點:Array.prototype.reduce()
、Array.prototype.concat()
函數
方法三:ui
const handle = array => { while(array.some(item => Array.isArray(item))) { array = [].concat(...array) } return array } handle(array) // [ 1, 1, 2, 3, 1, 2, {} ]
知識點:while
、Array.prototype.some()
、展開語法(Spread syntax)
this
其它方法:......prototype
描述:將數組中重複的元素過濾掉。code
let array = [1, 2, 1, '3', '3', 0 , 1] handle(array) // [1, 2, '3', 0]
方法一:ip
const handle = array => [...new Set(array)] handle(array) // [ 1, 2, '3', 0 ]
知識點:Set
方法二:
const handle = array => array.reduce((accumulator, currentValue) => { !accumulator.includes(currentValue) && accumulator.push(currentValue) return accumulator }, []) handle(array) // [ 1, 2, '3', 0 ]
知識點:Array.prototype.includes()
方法三:
const handle = array => { let map = new Map() return array.filter(item => map.has(item) ? false : map.set(item)) } handle(array) // [ 1, 2, '3', 0 ]
知識點:Map
、Array.prototype.filter()
其它方法:......
Function.prototype.bind = function () { let self = this, args = Array.from(arguments), context = args.shift(); return function () { return self.apply(context, args.concat(...arguments)) }; };
知識點:apply、call、bind
const handle = function() { let fn = Array.prototype.shift.call(arguments) let obj = Object.create(fn.prototype) let o = fn.apply(obj, arguments) return typeof o === 'object' ? o : obj; }
知識點:Object.create()
const num = 123456789; const handle = num => String(num).replace(/\B(?=(\d{3})+(?!\d))/g, ',') handle(num) // 123,456,789
知識點:正則表達式
、String.prototype.replace()
const num = 123456654321; const str = 'abababababab'; const handle = params => { let str_1 = String(params).replace(/[^0-9A-Za-z]/g, '').toLowerCase(); let str_2 = str_1.split('').reverse().join(); return str_1 === str_2 ? true : false } handle(num) // true handle(str) // false
知識點:String.prototype.split()
、Array.prototype.join()
const handle = (fn, interval) => { let timeId = null; return function() { if (!timeId) { timeId = setTimeout(() => { fn.apply(this, arguments) timeId = null }, interval) } } }
const handle = (fn, interval) => { let lastTime = 0 return function () { let now = Date.now(); if (now - lastTime > interval) { fn.apply(this, arguments) lastTime = now } } }
const handle = (fn, delay) => { let timeId; return function() { if (timeId) clearTimeout(timeId) timeId = setTimeout(() => { fn.apply(this, arguments) }, delay) } }
函數節流、函數防抖區別:函數節流和函數防抖較容易混淆,能夠這麼比喻,對於函數節流,門外有人頻繁敲門,可是門衛按固定時間來決定是否開門。對於函數防抖,門外有人頻繁敲門,門衛按最後一次敲門來決定是否開門。
class Pubsub { constructor() { this.handles = {} } subscribe(type, handle) { if (!this.handles[type]) { this.handles[type] = [] } this.handles[type].push(handle) } unsubscribe(type, handle) { let pos = this.handles[type].indexOf(handle) if (!handle) { this.handles.length = 0 } else { ~pos && this.handles[type].splice(pos, 1) } } publish() { let type = Array.prototype.shift.call(arguments) this.handles[type].forEach(handle => { handle.apply(this, arguments) }) } } const pub = new Pubsub() pub.subscribe('a', function() {console.log('a', ...arguments)}) pub.publish('a', 1, 2, 3) // a 1 2 3