摘要:我對(duì)數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)最近在上做了一道題目,嗯,我這個(gè)渣渣沒有做出來,然后看了別人的解決方案,是時(shí)候?qū)W習(xí)一下的了。。。。。讀取對(duì)應(yīng)的鍵值,如果找不到返回鍵是函數(shù)返回一個(gè)布爾值,表示某個(gè)鍵是否在數(shù)據(jù)結(jié)構(gòu)中。
我對(duì)ES6數(shù)據(jù)結(jié)構(gòu)Map的學(xué)習(xí)
最近在CodeWars上做了一道題目,嗯,我這個(gè)渣渣沒有做出來,然后看了別人的解決方案,Map???
是時(shí)候?qū)W習(xí)一下ES6的Map了。。。。。
以下是原題:(https://www.codewars.com/kata...)
Description:
You have a positive number n consisting of digits. You can do at most one operation: Choosing the index of a digit in the number, remove this digit at that index and insert it back to another place in the number.
Doing so, find the smallest number you can get.
Task:
Return an array or a tuple depending on the language (see "Your Test Cases" Haskell) with
1) the smallest number you got
2) the index i of the digit d you took, i as small as possible
3) the index j (as small as possible) where you insert this digit d to have the smallest number.
Example:
smallest(261235) --> [126235, 2, 0]
126235 is the smallest number gotten by taking 1 at index 2 and putting it at index 0
smallest(209917) --> [29917, 0, 1]
[29917, 1, 0] could be a solution too but index i in [29917, 1, 0] is greater than
index i in [29917, 0, 1].
29917 is the smallest number gotten by taking 2 at index 0 and putting it at index 1 which gave 029917 which is the number 29917.
smallest(1000000) --> [1, 0, 6]
以下就是某人的解決方案:
Array.prototype.move = function(from, to) { this.splice(to, 0, this.splice(from, 1)[0]); return this; }; function smallest(n) { let iter = `${n}`.length, res = new Map(); //使用ES6的模板字符串還有Map數(shù)據(jù)結(jié)構(gòu) for (let i = 0; i < iter; i++) { for (let j = 0; j < iter; j++) { let number = `${n}`.split("").move(i, j).join(""); //排列組合???哈哈 if (!res.has(+number)) res.set(+number, [i, j]); //添加鍵值對(duì)到Map } } let min = Math.min(...res.keys()); //res.keys()得到鍵名的遍歷器,然后擴(kuò)展運(yùn)算符轉(zhuǎn)化為數(shù)組,然后最小的number return [min, ...res.get(min)]; //res.get(min)得到對(duì)應(yīng)鍵名的鍵值 }
以下內(nèi)容來自大神博客:阮一峰ES6入門書籍
認(rèn)識(shí)Map數(shù)據(jù)結(jié)構(gòu)JavaScript的對(duì)象(Object),本質(zhì)上是鍵值對(duì)的集合(Hash結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當(dāng)作鍵。這給它的使用帶來了很大的限制。
Map數(shù)據(jù)結(jié)構(gòu)類似于對(duì)象,也是鍵值對(duì)的集合,但是鍵的范圍不限于字符串,各種類型的值都可以作為鍵。如果你需要“鍵值對(duì)”的數(shù)據(jù)結(jié)構(gòu),Map比Object更合適。
var m = new Map(); var o = {p: "hello world"}; m.set(0, "connect"); m.get(0); //"connect" m.has(0); //true m.delete(o); //true m.has(o); //falseMap實(shí)例的屬性和方法
size():返回Map結(jié)構(gòu)的成員總數(shù)
操作方法
set(key, value):設(shè)置對(duì)應(yīng)的鍵值,然后返回整個(gè)Map結(jié)構(gòu)。如果key已經(jīng)有值,則鍵值會(huì)被更新。
var m = new Map(); m.set("edition", 6) // 鍵是字符串 m.set(262, "standard") // 鍵是數(shù)值 m.set(undefined, "nah") // 鍵是undefined //set方法返回的是Map本身,因此可以采用鏈?zhǔn)綄懛ā?let map = new Map() .set(1, "a") .set(2, "b") .set(3, "c");
get(key):讀取key對(duì)應(yīng)的鍵值,如果找不到key返回undefined
var m = new Map(); var hello = function() { console.log("hello"); } m.set(hello, "Hello ES6!") // 鍵是函數(shù) m.get(hello) // Hello ES6!
has(key):返回一個(gè)布爾值,表示某個(gè)鍵是否在Map數(shù)據(jù)結(jié)構(gòu)中。
delete(key):刪除某個(gè)鍵,成功返回true;刪除失敗返回false。
clear():刪除所有成員,沒有返回值。
遍歷方法
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回所有成員的遍歷器
forEach():遍歷Map的所有成員
let map = new Map([ ["F", "no"], ["T", "yes"], ]); for (let key of map.keys()) { console.log(key); } // "F" // "T" for (let value of map.values()) { console.log(value); } // "no" // "yes" for (let item of map.entries()) { console.log(item[0], item[1]); } // "F" "no" // "T" "yes" // 或者 for (let [key, value] of map.entries()) { console.log(key, value); } // 等同于使用map.entries() for (let [key, value] of map) { console.log(key, value); }Map數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換
Map轉(zhuǎn)換為數(shù)組
使用擴(kuò)展運(yùn)算符(...)
let mao = new Map().set(true, 7).set({foo: 3}, ["abc"]); [...mao]; //[ [true, 7], [{foo: 3}, ["abc"]] ]
轉(zhuǎn)換為數(shù)組結(jié)構(gòu)之后,結(jié)合數(shù)組的map()方法,filter()方法可以實(shí)現(xiàn)Map的遍歷和過濾。Map本身沒有map和filter方法,但是有一個(gè)forEach方法
let map0 = new Map() .set(1, "a") .set(2, "b") .set(3, "c"); let map1 = new Map( [...map0].filter(([k, v]) => k < 3) ); // 產(chǎn)生Map結(jié)構(gòu) {1 => "a", 2 => "b"} let map2 = new Map( [...map0].map(([k, v]) => [k * 2, "_" + v]) ); // 產(chǎn)生Map結(jié)構(gòu) {2 => "_a", 4 => "_b", 6 => "_c"}
數(shù)組轉(zhuǎn)為Map
new Map([[true, 7], [{foo: 3}, ["abc"]]]) // Map {true => 7, Object {foo: 3} => ["abc"]}PS:
下面的例子中,字符串true和布爾值true是兩個(gè)不同的鍵。
var m = new Map([ [true, "foo"], ["true", "bar"] ]); m.get(true) // "foo" m.get("true") // "bar"
如果對(duì)同一個(gè)鍵多次賦值,后面的值將覆蓋前面的值。
let map = new Map(); map .set(1, "aaa") .set(1, "bbb"); map.get(1) // "bbb"
上面代碼對(duì)鍵1連續(xù)賦值兩次,后一次的值覆蓋前一次的值。
如果讀取一個(gè)未知的鍵,則返回undefined。
new Map().get("asfddfsasadf") // undefined
注意,只有對(duì)同一個(gè)對(duì)象的引用,Map結(jié)構(gòu)才將其視為同一個(gè)鍵。這一點(diǎn)要非常小心。
var map = new Map(); map.set(["a"], 555); map.get(["a"]) // undefined
上面代碼的set和get方法,表面是針對(duì)同一個(gè)鍵,但實(shí)際上這是兩個(gè)值,內(nèi)存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。
由上可知,Map的鍵實(shí)際上是跟內(nèi)存地址綁定的,只要內(nèi)存地址不一樣,就視為兩個(gè)鍵。這就解決了同名屬性碰撞(clash)的問題,我們擴(kuò)展別人的庫的時(shí)候,如果使用對(duì)象作為鍵名,就不用擔(dān)心自己的屬性與原作者的屬性同名。
如果Map的鍵是一個(gè)簡(jiǎn)單類型的值(數(shù)字、字符串、布爾值),則只要兩個(gè)值嚴(yán)格相等,Map將其視為一個(gè)鍵,包括0和-0。另外,雖然NaN不嚴(yán)格相等于自身,但Map將其視為同一個(gè)鍵。
let map = new Map(); map.set(NaN, 123); map.get(NaN) // 123 這里是同一個(gè)鍵 map.set(-0, 123); map.get(+0) // 123
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88194.html
摘要:,黑色的主題風(fēng)格,很符合。時(shí)間復(fù)雜度雖然成功,但我明顯感覺代碼寫得不是很優(yōu)雅。這個(gè)是沒錯(cuò)的,但缺乏了宏觀的視角,會(huì)變得片面。但是不重要,關(guān)鍵是這個(gè)思想要學(xué)習(xí),可以應(yīng)用到其他地方。求和,大于就返回偶數(shù)的位置,否則返回奇數(shù)的位置。 前幾天做LeetCode上的大數(shù)乘法,代碼沒錯(cuò),可就是提交不成功,顯示SyntaxError: Unexpected token var我把所有代碼都注釋掉,只...
摘要:發(fā)現(xiàn)一個(gè)很好的練習(xí)做題網(wǎng)站都是自己做過的,先放自己的答案,再放自己覺得不錯(cuò)的其他回答。 發(fā)現(xiàn)一個(gè)很好的練習(xí)做題網(wǎng)站 Codewars 都是自己做過的,先放自己的答案,再放自己覺得不錯(cuò)的其他回答。 1. 將首字母放到后面并加上ay pigIt(This is my string)轉(zhuǎn)換成:pigIt(hisTay siay ymay tringsay) mine function...
摘要:?jiǎn)栴}簡(jiǎn)述給予一個(gè)多維數(shù)組和一個(gè)描述取值路徑的一維數(shù)組通過調(diào)用函數(shù)返回取值路徑描述的值,如原問題傳送門之所以想記錄一下是因?yàn)橹坝性谒㈩}的習(xí)慣,后來工作忙就怠慢了,今天閑來無事就準(zhǔn)備刷幾道玩玩,然后就挑了一個(gè)比較簡(jiǎn)單的中的難度評(píng)級(jí)的題。 問題簡(jiǎn)述 給予一個(gè)多維數(shù)組和一個(gè)描述取值路徑的一維數(shù)組, 通過調(diào)用函數(shù)f返回取值路徑描述的值,如f([[1, 2], [3, 4], [5, 6]], ...
摘要:當(dāng)我完成這個(gè)題目并且看到其他大神的答案時(shí),我就覺得我真的很有必要記錄一下這道題,并且思考它在中的實(shí)現(xiàn)。表示被查找的值方法返回一個(gè)由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實(shí)踐才是學(xué)習(xí)前端的最佳實(shí)踐。 之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終...
閱讀 1072·2023-04-26 02:02
閱讀 2413·2021-09-26 10:11
閱讀 3567·2019-08-30 13:10
閱讀 3756·2019-08-29 17:12
閱讀 729·2019-08-29 14:20
閱讀 2196·2019-08-28 18:19
閱讀 2245·2019-08-26 13:52
閱讀 968·2019-08-26 13:43