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