關於ES6中Map的用法和Object的擴展

在寫完上一篇我經歷的前端面試題(一)兩個月後的今天,我又重新審視自己寫的東西。果然發現了一些錯誤。這篇主要糾正上篇文章中最後第13題的解法中的一些用錯的地方。

題目:算法題:給一個數組,無序。輸出其中沒有的最小正整數,時間複雜度爲O(n)。

原解法:

let testArray=[7,-1,2,4,4,8,7,3,5];
let mapping=new Map();
for(var i=0;i<testArray.length;i++){
    if(testArray[i]>0){
        mapping[testArray[i]]=true;
    }
}
console.log(mapping);
var minValue=Object.keys(mapping)[0];
var maxValue=Object.keys(mapping)[Object.keys(mapping).length-1];
for(var i=minValue;i<maxValue;i++){
    if(mapping[i]!=true){
        console.log(i);
        return;
    }
}
  • 首先說,這個解法有一處邏輯錯誤:審題錯誤。

在找這個數的時候,由於console.log(mapping)的時候是一個key有序的對象,我用minValue和maxValue分別代表第一個(最小)key和最後一個(最大)key進行遍歷。這樣的解法忽略了最小正整數1不在測試用例裏的情況。

即,如果測試用例如上,會輸出6而不是1,因爲是從2到8遍歷的。

  • 其次,這裏的Map用法錯誤。(與Object對比)

Map是ES6的一種數據結構。

它類似於對象(Object {}),也是鍵值對的集合。

Object的鍵(key)只能是字符串。結構提供了“字符串—值”的對應

而Map的key的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。Map 結構提供了“值—值”的對應

因此Map是一種更完善的 Hash 結構實現。

Map的用法:

使用set(key,value)添加元素

/*遍歷一個數組爲map 使key>0的值爲true,否則爲false*/
const map = new Map()
let arr = [7,-1,2,4,1,4,8,7,3,5]
arr.forEach((value, index)=> {
    value >0 ? map.set(value, true) : map.set(value, false)
})
console.log(map)

使用size屬性返回map成員個數

console.log(map.size) // 10

🌟而在上面的解法中,map的使用不規範,map中沒有成員,map.size爲0

原解法中給map增加元素的方法是Object的方法。

let obj = {}
let testArr = [7,-1,2,4,1,4,8,7,3,5]
testArr.forEach((value)=> {
  value >0 ? obj[value] = true : ''
})
console.log(obj) // 注意這裏輸出爲有序

Object中成員個數不能用length來返回(沒有此屬性)-- 爲什麼沒有?涉及原型鏈知識。準備再寫一篇

console.log(obj.length) // undefined

那麼如何獲取Object中成員個數呢?

可以使用ES6中Object的擴展:屬性的可枚舉性和遍歷

用的比較多的:

Object.keys(obj) // 返回對象自身的所有可枚舉的屬性的鍵名的數組

Object.values(obj) // 返回一個給定對象自身的所有可枚舉屬性值的數組

因爲返回的是數組,所以可以通過length屬性獲得對象中成員屬性。

console.log(Object.keys(obj))
console.log(Object.keys(obj).length) // 7

  • Map是無序,但是由上面截圖可以看出,obj是有序的,這是爲什麼呢?

🌟根據屬性遍歷的次序規則

由於obj中的key都是數值型,所以是按照升序排列的,因此會得到一個key有序且爲升序的對象。

綜上,我現在改進此題解法。

1.增加多種情況判斷

2.精簡代碼

function minPositiveInt(arr){
  let obj = {}
  if(arr.length == 0){
    return 1
  }
  if(arr.length == 1){
    return arr[0]
  }
  arr.forEach((value)=> {
      value > 0 ? obj[value] = true : ''
  })
  for(var i = Object.keys(obj)[0]; i< Object.keys(obj)[Object.keys(obj).length-1]; i++){
    if(!obj[i]){
      return i
    }
  }
}

let testArr = [7,-1,2,4,1,4,8,7,3,5]
console.log(minPositiveInt(testArr)) // 6

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章