成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

由codewars上的一道題目學(xué)習(xí)ES6的Map

IamDLY / 1354人閱讀

摘要:我對(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); //false
Map實(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

相關(guān)文章

  • 入坑codewars

    摘要:,黑色的主題風(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我把所有代碼都注釋掉,只...

    sherlock221 評(píng)論0 收藏0
  • 刷題——Codewars Js題目(持續(xù)更新)

    摘要:發(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...

    toddmark 評(píng)論0 收藏0
  • 一道簡(jiǎn)單多維數(shù)組取值問題

    摘要:?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]], ...

    tracymac7 評(píng)論0 收藏0
  • 記一次JavaScript API練習(xí)題

    摘要:當(dāng)我完成這個(gè)題目并且看到其他大神的答案時(shí),我就覺得我真的很有必要記錄一下這道題,并且思考它在中的實(shí)現(xiàn)。表示被查找的值方法返回一個(gè)由替換值替換一些或所有匹配的模式后的新字符串。舉一反三,多多思考,多多實(shí)踐才是學(xué)習(xí)前端的最佳實(shí)踐。 之前,我在Codewars上看到一道名為Recover a secret string from random triplets的題,這道題使我沉思了很久,最終...

    scq000 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<