摘要:詳見我的另一篇文章前端面試問題之面向?qū)ο箢悓崿F(xiàn)代碼父類我的名字是我今年歲原型繼承原型鏈相關(guān)問題請看我的另一篇文章前端面試之原型鏈問題實現(xiàn)效果構(gòu)造函數(shù)繼承實現(xiàn)效果組合繼承實現(xiàn)效果組合繼承優(yōu)化實現(xiàn)效果未完待續(xù)
Github - program-learning-lists
知乎
個人博客
Github
“開源(open source)”這個詞,指的是事物規(guī)劃為可以公開訪問的,因此人們可以修改并分享。
作為一個從大型同性社交網(wǎng)站GitHub / Rain120上學(xué)習(xí)成長的一個前端菜鳥的我,深受大佬的感染,也希望有機會能夠給同樣是菜鳥的你們提供幫助,在我學(xué)習(xí)之余,留下了之前學(xué)習(xí)遇到的、網(wǎng)上看到的、筆試面試遇到的一些編程的解法,還請各位大佬手下留情,多多提攜、指點我等菜鳥。
歡迎各位大佬留下更加簡單的寫法,謝謝??!
代碼倉庫: Web-Study
廢話不多說,先上題吧。
1、關(guān)系型數(shù)組轉(zhuǎn)換成樹形結(jié)構(gòu)對象(拼多多2018前端筆試真題 / 依圖面試)關(guān)系型數(shù)組
var obj = [ { id:3, parent:2 }, { id:1, parent:null }, { id:2, parent:1 }, ]
期望結(jié)果:
o = { obj: { id: 1, parent: null, child: { id: 2, parent: 1, child: { id: ,3, parent: 2 } } } }
思路:
先找到它的根元素,根據(jù)id和parent來判斷它們之間的關(guān)系
實現(xiàn)源碼:
function treeObj(obj) { obj.map(item => { if (item.parent !== null) { obj.map(o => { if (item.parent === o.id) { if (!o.child) { o.child = []; } o.child.push(item); o.child = o.child; } }); } }); return obj.filter(item => item.parent === null)[0] }
解法2:(知乎評論區(qū)提供的方法)
function treeObj(obj) { return obj.sort((a, b) => b.parent - a.parent) .reduce((acc, cur) => (acc ? { ...cur, child: acc } : cur)); }
實現(xiàn)效果:
parseUrl("http://www.xiyanghui.com/product/list?id=123456&sort=discount#title");
期望結(jié)果:
{ protocol: "http", host: "www.xiyanghui.com", path: "/product/list", params: { id: "12345", sort: "discount" }, hash: "title" }
思路:
首先我們需要了解一下URL這個概念。
URL(統(tǒng)一資源定位符)(或稱統(tǒng)一資源定位器/定位地址、URL地址等,英語:Uniform Resource Locator,常縮寫為URL),有時也被俗稱為網(wǎng)頁地址(網(wǎng)址)。
這里,我補充一點,各位不僅需要了解 URL,還需要了解 URI。
URI:統(tǒng)一資源標(biāo)識符(英語:Uniform Resource Identifier,或URI)是一個用于標(biāo)識某一互聯(lián)網(wǎng)資源名稱的字符串。 該種標(biāo)識允許用戶對網(wǎng)絡(luò)中(一般指萬維網(wǎng))的資源通過特定的協(xié)議進行交互操作。URI的最常見的形式是統(tǒng)一資源定位符(URL),經(jīng)常指定為非正式的網(wǎng)址。更罕見的用法是統(tǒng)一資源名稱(URN),其目的是通過提供一種途徑。用于在特定的名字空間資源的標(biāo)識,以補充網(wǎng)址。
URI包括了URL和URN。
下圖展示了兩個 URI 例子及它們的組成部分。
URL一般包括協(xié)議、域名、端口、query、params等,我們在傳入?yún)?shù)時是字符串,我們需要將它轉(zhuǎn)換成URL,可以通過創(chuàng)建一個a標(biāo)簽來將字符串 轉(zhuǎn)換成URL 。
實現(xiàn)源碼:
function parseUrl(url) { var a = document.createElement("a"); a.href = url; return { source: url, protocol: a.protocol.replace(":",""), host: a.hostname, port: a.port, query: a.search, params: (() => { var ret = {}, querys = []; var searchQuery = a.search.replace(/^?/,"").split("&"); for ( var i = 0;i < searchQuery.length; i++) { if (searchQuery[i]) { querys = searchQuery[i].split("="); ret[querys[0]] = querys[1]; } } return ret; })(), file: (a.pathname.match(//([^/?#]+)$/i) || [,""])[1], hash: a.hash.replace("#",""), path: a.pathname.replace(/^([^/])/,"/$1"), relative: (a.href.match(/tps?://[^/]+(.+)/) || [,""])[1], segments: a.pathname.replace(/^//,"").split("/") }; } parseUrl("http://www.xiyanghui.com/product/list?id=123456&sort=discount#title");
實現(xiàn)效果:
[1, 2, 3]
期望結(jié)果:
全排列:
[[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
思路:
每次取數(shù)組中的一個數(shù),然后將剩余的數(shù),依次加入到該數(shù)的組合數(shù)組中
實現(xiàn)代碼:
function Permutations (target, size, origin) { var _arr = [] function getArrange(target, nums, ret) { if (nums === 1) { for (var i = 0; i < target.length; i++) { var tmp = ret.slice(); tmp.push(target[i]); _arr.push(tmp); } } else { nums -= 1; for (var i = 0; i < target.length; i++) { var tmp = ret.slice(); var newTarget = target.slice(); tmp.push(target[i]); newTarget.splice(i, 1); getArrange(newTarget, nums, tmp); } } } getArrange(target, size, origin); return _arr; } Permutations([1, 2, 3], 2, [])
實現(xiàn)效果:
[1, 2, 3, 4]
排列組合:
[[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
思路:
取一個數(shù),加入到數(shù)組中,接著再取一個數(shù)加入數(shù)組,直到需要的num為0。
實現(xiàn)代碼:
function Permutations (arr, nums) { var ret = []; function getRet(origin, target, nums) { if (nums === 0) { ret[ret.length] = origin; return; } for (var i = 0; i <= target.length - nums; i++) { var tmp = origin.slice(); tmp.push(target[i]); getRet(tmp, target.slice(i + 1), nums - 1); } } getRet([], arr, nums); return ret; } Permutations([1, 2, 3, 4], 3)
實現(xiàn)效果:
// 當(dāng)出現(xiàn)連續(xù)數(shù)字的時候以‘-’輸出 [1, 2, 3, 4, 6, 8, 9, 10]
期望結(jié)果:
["1-4", 6, "8-10"]
原理:
判斷前后數(shù)字是否相差為1,如果是則加入同一個數(shù)組
實現(xiàn)代碼:
判斷是否連續(xù):
var arrange = function(arr){ var result = [],temp = []; arr.sort(function(source, dest){ return source - dest; }).concat(Infinity).reduce(function(source, dest){ temp.push(source); if(dest-source > 1){ result.push(temp); temp = []; } return dest; }); return result; };
實現(xiàn)效果:
格式化實現(xiàn):
var formatarr = function(arr) { var newArr = [] var arr1 = arrange(arr) for (var i in arr1) { var str = ""; if (arr1[i].length > 1) { str = arr1[i][0] + "-" + arr1[i][arr1[i].length - 1]; newArr.push(str) } else { newArr.push(arr1[i][0]); } } return newArr; }
實現(xiàn)效果:
實現(xiàn)代碼:
父類:
function People(name,age){ this.name=name; this.age=age; this.say=function(){ console.log("我的名字是:"+this.name+"我今年"+this.age+"歲!"); }; }
原型繼承:(原型鏈相關(guān)問題請看我的另一篇文章前端面試之原型鏈問題)
function Child(name, age){ this.name = name; this.age = age; } Child.prototype = new People(); var child = new Child("Rainy", 20); child.say()
實現(xiàn)效果:
構(gòu)造函數(shù)繼承
function Child(name, age){ People.call(this) this.name = name; this.age = age; } var child = new Child("Rainy", 20); child.say()
實現(xiàn)效果:
組合繼承:
function Child(name, age){ People.call(this); this.name = name; this.age = age; } Child.prototype = People.prototype; var child = new Child("Rainy", 20); child.say()
實現(xiàn)效果:
組合繼承優(yōu)化:
function Child(name, age){ People.call(this); this.name = name; this.age = age; } Child.prototype = Object.create(People.prototype); Child.prototype.constructor = Child; var child = new Child("Rainy", 20); child.say()
實現(xiàn)效果:
未完待續(xù)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108441.html
摘要:半路出家的前端程序員應(yīng)該不在少數(shù),我也是其中之一。年,馮馮同事兼師兄看我寫太費勁,跟我說對面樓在找,問我要不要學(xué),說出來可能有點丟人,但是在那之前,我真得不知道什么是,什么是。 半路出家的前端程序員應(yīng)該不在少數(shù),我也是其中之一。 為何會走向前端 非計算機專業(yè)的我,畢業(yè)之后,就職于一家電力行業(yè)公司,做過設(shè)備調(diào)試、部門助理、測試,也寫過一段時間的QT,那三年的時間,最難過的不是工作忙不忙,...
摘要:獲取的對象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對象即使沒有代碼,也會把默認(rèn)的祖宗八代都顯示出來而只能獲取元素屬性中的樣式。因此對于一個光禿禿的元素,方法返回對象中屬性值如果有就是據(jù)我測試不同環(huán)境結(jié)果可能有差異而就是。 花了很長時間整理的前端面試資源,喜歡請大家不要吝嗇star~ 別只收藏,點個贊,點個star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項目地址 https:...
摘要:手冊網(wǎng)超級有用的前端基礎(chǔ)技術(shù)面試問題收集前端面試題目及答案匯總史上最全前端面試題含答案常見前端面試題及答案經(jīng)典面試題及答案精選總結(jié)前端面試過程中最容易出現(xiàn)的問題前端面試題整理騰訊前端面試經(jīng)驗前端基礎(chǔ)面試題部分最新前端面試題攻略前端面試前端入 手冊網(wǎng):http://www.shouce.ren/post/index 超級有用的前端基礎(chǔ)技術(shù)面試問題收集:http://www.codec...
摘要:手冊網(wǎng)超級有用的前端基礎(chǔ)技術(shù)面試問題收集前端面試題目及答案匯總史上最全前端面試題含答案常見前端面試題及答案經(jīng)典面試題及答案精選總結(jié)前端面試過程中最容易出現(xiàn)的問題前端面試題整理騰訊前端面試經(jīng)驗前端基礎(chǔ)面試題部分最新前端面試題攻略前端面試前端入 手冊網(wǎng):http://www.shouce.ren/post/index 超級有用的前端基礎(chǔ)技術(shù)面試問題收集:http://www.codec...
摘要:循環(huán)可以使用的范圍包括數(shù)組和結(jié)構(gòu)某些類似數(shù)組的對象對象,以及字符串。只能遍歷數(shù)組,不能中斷,返回值是修改后的數(shù)組。除了之外,等,也有同樣的問題。聲明一個只讀的常量。這在語法上,稱為暫時性死區(qū)。暫時性死區(qū)也意味著不再是一個百分百安全的操作。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包...
閱讀 2285·2021-10-09 09:41
閱讀 3454·2021-09-13 10:34
閱讀 1953·2019-08-30 12:59
閱讀 587·2019-08-29 17:27
閱讀 1092·2019-08-29 16:07
閱讀 2987·2019-08-29 13:15
閱讀 1339·2019-08-29 13:14
閱讀 1600·2019-08-26 12:18