摘要:我對數據結構的學習最近在上做了一道題目,嗯,我這個渣渣沒有做出來,然后看了別人的解決方案,是時候學習一下的了。。。。。讀取對應的鍵值,如果找不到返回鍵是函數返回一個布爾值,表示某個鍵是否在數據結構中。
我對ES6數據結構Map的學習
最近在CodeWars上做了一道題目,嗯,我這個渣渣沒有做出來,然后看了別人的解決方案,Map???
是時候學習一下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數據結構 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]); //添加鍵值對到Map } } let min = Math.min(...res.keys()); //res.keys()得到鍵名的遍歷器,然后擴展運算符轉化為數組,然后最小的number return [min, ...res.get(min)]; //res.get(min)得到對應鍵名的鍵值 }
以下內容來自大神博客:阮一峰ES6入門書籍
認識Map數據結構JavaScript的對象(Object),本質上是鍵值對的集合(Hash結構),但是傳統(tǒng)上只能用字符串當作鍵。這給它的使用帶來了很大的限制。
Map數據結構類似于對象,也是鍵值對的集合,但是鍵的范圍不限于字符串,各種類型的值都可以作為鍵。如果你需要“鍵值對”的數據結構,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實例的屬性和方法
size():返回Map結構的成員總數
操作方法
set(key, value):設置對應的鍵值,然后返回整個Map結構。如果key已經有值,則鍵值會被更新。
var m = new Map(); m.set("edition", 6) // 鍵是字符串 m.set(262, "standard") // 鍵是數值 m.set(undefined, "nah") // 鍵是undefined //set方法返回的是Map本身,因此可以采用鏈式寫法。 let map = new Map() .set(1, "a") .set(2, "b") .set(3, "c");
get(key):讀取key對應的鍵值,如果找不到key返回undefined
var m = new Map(); var hello = function() { console.log("hello"); } m.set(hello, "Hello ES6!") // 鍵是函數 m.get(hello) // Hello ES6!
has(key):返回一個布爾值,表示某個鍵是否在Map數據結構中。
delete(key):刪除某個鍵,成功返回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數據結構的轉換
Map轉換為數組
使用擴展運算符(...)
let mao = new Map().set(true, 7).set({foo: 3}, ["abc"]); [...mao]; //[ [true, 7], [{foo: 3}, ["abc"]] ]
轉換為數組結構之后,結合數組的map()方法,filter()方法可以實現Map的遍歷和過濾。Map本身沒有map和filter方法,但是有一個forEach方法
let map0 = new Map() .set(1, "a") .set(2, "b") .set(3, "c"); let map1 = new Map( [...map0].filter(([k, v]) => k < 3) ); // 產生Map結構 {1 => "a", 2 => "b"} let map2 = new Map( [...map0].map(([k, v]) => [k * 2, "_" + v]) ); // 產生Map結構 {2 => "_a", 4 => "_b", 6 => "_c"}
數組轉為Map
new Map([[true, 7], [{foo: 3}, ["abc"]]]) // Map {true => 7, Object {foo: 3} => ["abc"]}PS:
下面的例子中,字符串true和布爾值true是兩個不同的鍵。
var m = new Map([ [true, "foo"], ["true", "bar"] ]); m.get(true) // "foo" m.get("true") // "bar"
如果對同一個鍵多次賦值,后面的值將覆蓋前面的值。
let map = new Map(); map .set(1, "aaa") .set(1, "bbb"); map.get(1) // "bbb"
上面代碼對鍵1連續(xù)賦值兩次,后一次的值覆蓋前一次的值。
如果讀取一個未知的鍵,則返回undefined。
new Map().get("asfddfsasadf") // undefined
注意,只有對同一個對象的引用,Map結構才將其視為同一個鍵。這一點要非常小心。
var map = new Map(); map.set(["a"], 555); map.get(["a"]) // undefined
上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。
由上可知,Map的鍵實際上是跟內存地址綁定的,只要內存地址不一樣,就視為兩個鍵。這就解決了同名屬性碰撞(clash)的問題,我們擴展別人的庫的時候,如果使用對象作為鍵名,就不用擔心自己的屬性與原作者的屬性同名。
如果Map的鍵是一個簡單類型的值(數字、字符串、布爾值),則只要兩個值嚴格相等,Map將其視為一個鍵,包括0和-0。另外,雖然NaN不嚴格相等于自身,但Map將其視為同一個鍵。
let map = new Map(); map.set(NaN, 123); map.get(NaN) // 123 這里是同一個鍵 map.set(-0, 123); map.get(+0) // 123
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88194.html
摘要:,黑色的主題風格,很符合。時間復雜度雖然成功,但我明顯感覺代碼寫得不是很優(yōu)雅。這個是沒錯的,但缺乏了宏觀的視角,會變得片面。但是不重要,關鍵是這個思想要學習,可以應用到其他地方。求和,大于就返回偶數的位置,否則返回奇數的位置。 前幾天做LeetCode上的大數乘法,代碼沒錯,可就是提交不成功,顯示SyntaxError: Unexpected token var我把所有代碼都注釋掉,只...
摘要:發(fā)現一個很好的練習做題網站都是自己做過的,先放自己的答案,再放自己覺得不錯的其他回答。 發(fā)現一個很好的練習做題網站 Codewars 都是自己做過的,先放自己的答案,再放自己覺得不錯的其他回答。 1. 將首字母放到后面并加上ay pigIt(This is my string)轉換成:pigIt(hisTay siay ymay tringsay) mine function...
摘要:問題簡述給予一個多維數組和一個描述取值路徑的一維數組通過調用函數返回取值路徑描述的值,如原問題傳送門之所以想記錄一下是因為之前有在刷題的習慣,后來工作忙就怠慢了,今天閑來無事就準備刷幾道玩玩,然后就挑了一個比較簡單的中的難度評級的題。 問題簡述 給予一個多維數組和一個描述取值路徑的一維數組, 通過調用函數f返回取值路徑描述的值,如f([[1, 2], [3, 4], [5, 6]], ...
摘要:當我完成這個題目并且看到其他大神的答案時,我就覺得我真的很有必要記錄一下這道題,并且思考它在中的實現。表示被查找的值方法返回一個由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實踐才是學習前端的最佳實踐。 之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終...
閱讀 1061·2023-04-26 02:02
閱讀 2401·2021-09-26 10:11
閱讀 3553·2019-08-30 13:10
閱讀 3743·2019-08-29 17:12
閱讀 720·2019-08-29 14:20
閱讀 2187·2019-08-28 18:19
閱讀 2230·2019-08-26 13:52
閱讀 954·2019-08-26 13:43