深入探究數組常用API學習筆記(一)

  • 仿寫Array.prototype.forEach

    	// [].forEach((elem, index, array) => {})
    	Array.prototype.forEach = function (func) {
    		for (var i = 0, len = this.length; i < len; i ++) {
    			func(this[i], i, this)
    		}
    	}
    	// 所以forEach的回調函數中不支持break
    
  • 仿寫Array.prototype.filter

    	// [].filter((elem, index, array) => {})
    	Array.prototype.filter = function (func) {
    		var res = []
    		for (var i = 0, len = this.length; i < len; i ++) {
    			if (func(this[i], i, this)) {
    				res.push(this[i])
    			}
    		}
    		return res
    	}
    
  • 仿寫Array.prototype.map

    	// [].map((item, index, array) => {})
    	Array.prototype.simpleMap = function (func) {
    		var res = []
    		for (var i = 0, len = this.length; i < len; i ++) {
    			// 【注意】: 這是淺拷貝
    			res.push(func(this[i], i, this))
    		}
    		return res
    	}
    
    	Array.prototype.deepMap = function (func) {
    		var res = []
    		for (var i = 0, len = this.length; i < len; i ++) {
    			// 【注意】: 這是深拷貝
    			let newItem = func(deepClone(this[i]), i, this)
    			res.push( newItem )				
    		}
    		return res
    	}
    
    	function _deepClone(origin) {
    		// 原始值直接返回
    		if (typrof(origin) !== 'object' || origin == null) {
    			return origin
    		}
    
    		// 初始化克隆結果
    		let cloneObj
    		if (origin instanceof Array) { cloneObj = [] }
    		if (origin instanceof Object) { cloneObj = {} }
    		
    		// 對於引用值遍歷克隆
    		for (let key in origin) {
    			if (Object.hasOwnProperty(key)) {
    				cloneObj[key] = deepClone(origin[key])
    			}
    		}
    
    		// 返回克隆結果
    		return clone
    	}
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章