不想用Object和Array存儲數據,你還有Set和Map

2021-01-08 讀芯術

全文共4271字,預計學習時長11分鐘

圖源:unsplash

許多年來,程式設計師們一直使用Object和Array來存儲數據,這種趨勢不僅僅局限於JavaScript。除了這兩個選項外,沒有其他選擇來存儲多個值和處理數據結構。然而,在使用Object和Array時有幾個限制,例如:

· Array可以存儲重複的元素。

· 沒有像Array那樣找到Object長度的方法。

· 只有字符串可以存儲在Object中,不記插入順序。

· 開發人員必須根據用例選擇數組或對象。

· 像Lodash這樣的第三方庫被用來增強數組的功能。

隨著2015年ES6的發布,情況開始好轉。ES6引入了對Map和Set的支持,旨在克服上述限制。

什麼是Set和Map?

如前所述,這兩個功能都是在JavaScript的ES6版本中引入的。Set是唯一元素的有序集合。「唯一元素」是最重要的,因為它意味著一個Set中不能存儲重複的元素。但是它沒有鍵-值對系統。

Map是Array和Object數據結構的組合。它像Object一樣是鍵-值對的Set,但它也記住插入格式,並具有length(.size)屬性。

· Set的聲明和初始化:一個集合可以像這樣初始化。

const set = newSet();

· 從Set中添加和刪除元素:你可以使用.add()方法輕鬆地將元素插入到集合中。

constset = new Set();set.add('John');set.add('Martha')set.add('Bryan');set.add('John');//set = {'John','Martha','Bryan'}

JavaScript中的Set借用了很多數學集合的屬性,並且只包含唯一的元素。刪除元素也非常簡單,使用.delete()方法刪除單個元素,或使用.clear()方法刪除所有元素。

set.add('John');set.add('Martha')set.add('Bryan');set.delete('Martha')//set= {'John','Bryan'}set.clear(); // removes all the element

· Set的大小:使用.size,你可以很容易地找到有用的Set的大小。

set.add('a')set.add('b');set.add('c');console.log(set.size) // => 3

· 訪問Set中的元素:Set在嘗試記錄或訪問其值時的方式不同。你可以記錄數組並查看元素,但這不適用於Set。

var arr=[1,2,3];constset = new Set(arr);console.log(set) // => [objectSet]console.log(arr) // => (3) [1,2,3]

為了訪問Set,我們需要一個SetIterator()來獲取所有的值。JavaScript提供了一個屬性.values()來獲取一個迭代器,然後我們可以將該迭代器與循環結合使用獲取所有的值。如以下代碼片段演示:

var arr=[1,2,3];constset = new Set(arr);variterator=set.values()console.log(iterator.next().value) //1

檢索所有元素更簡單的方法是使用.forEach(),如下所示:

var arr=[1,2,3];constset = new Set(arr);set.forEach(v=>console.log(v))

輸出:

1

2

3

此外,你可以使用.has()方法檢查是否存在某個值,如果找到該元素,該方法將返回true。

var arr=[1,2,3];constset = new Set(arr);console.log(set.has(1)); // true

值得一提的是,儘管Set不支持鍵-值對元素,但keys()和entries()等方法對Set是可用的。

Set vs Array

Set和Array傾向於執行和處理相同的操作,但存在一些差異。最大的區別是Set不能像Array那樣有重複項,而Set提供了一種更簡單的方法來刪除項。此外,Set的元素在插入順序上是可迭代的。

與數學集合一樣,JavaScript中的集合也可以用於執行union和intersection等操作,這些操作可以在合併數據或在兩個Set中尋找公共元素時使用。

初始化和聲明Map

與Set類似,Map也可以用同樣的方式聲明。

constmap = new Map();

從Map中添加和刪除元素:Map支持類似Object的鍵值對。因此,在增加價值的同時,我們也需要提供一個密鑰。這和我們在Set中看到的不一樣。

const map = new Map();map.set('Name', 'iPhone'); // map.set(key,value)formatmap.set('Brand', 'Apple');map.set('Price', '$1000');

要從Map中刪除一個值,我們可以簡單地將鍵傳遞給.delete()屬性。

constmap = new Map();map.set('Name', 'iPhone'); map.set('Brand','Apple');map.set('Price', '$1000');map.delete('Price'); //removes the elementwith key 'Price'

與Set類似,可以使用.clear()刪除所有元素。

map.clear() // removes all the element

Map的大小:使用.size可以很容易地檢索Map的大小(長度)。

constmap = new Map();map.set('Name', 'iPhone');map.set('Brand','Apple');map.set('Price', '$1000');console.log(map.size)//=> 3

訪問Map中的元素:Map為我們提供了一個.get()方法,通過將鍵作為參數傳遞到方法中來快速獲取值。

constmap = new Map();map.set('Name', 'iPhone');map.set('Brand','Apple');map.set('Price', '$1000');console.log(map.get('Name'));//iPhoneconsole.log(map.get('Brand')); // Apple

但是如果你只想要鍵、值,或者鍵和值都想要,該怎麼辦呢?Map有.keys(),.values()和.entries()分別實現相同的功能。使用上面代碼中的相同Map:

console.log(map.keys());

// iterator {'Name','Brand',Price'}console.log(map.values());

// iterator {'iPhone','Apple','$1000'}console.log(map.entries());

//iterator {'Name':'iPhone','Brand':'Apple',Price':'$1000'}

Map的迭代也非常簡單:

//with for-each

map.forEach((value, key) => {

console.log(`${key} is ${value} yearsold!`);

});

// with for-of

for(const [key, value] of map) {

console.log(`${key} : ${value}`);

}

此外,你可以使用.has()屬性並傳遞鍵輕鬆地檢查元素是否存在。

varmap = new Map();map.set('age',19);console.log(map.has('age')) // true since 'age' key ispresent

如果你決定將object轉換為map,JavaScript已經搞定了。我們之前使用.entries()來獲取所有鍵-值對,但這次我們將使用針對Object的方法。

const myObject= {

'Age': '25',

'Gender': 'Male',

'Nationality': 'Australian'

};

const myMap = newMap(Object.entries(myObject)); //object to mapconstanotherObject = Object.fromEntries(myMap) // map to object

你可以輕鬆地將map轉換為object,如上所示。要將Map轉換為Array,可以使用array .from(myMap)。

Map vs Array &Objects

Map似乎解決了Array和Object的許多缺點,比如它能夠處理更複雜的操作。Map就像是Array和Object的混合體。它有一個類似array的size屬性,可以以鍵-值對格式存儲元素。除此之外,它還提供了.has()之類的方法來檢查元素是否存在,這可以節省大量時間。

而且,它不要求鍵必須是字符串類型。你甚至可以使用一個對象作為鍵來幫助你編寫更好的代碼。

雖然Array和Object已經成為存儲集合和鍵-值對元素的事實上的標準,但通過引入Map和Set,你可以為代碼提供一種有趣的方法。Set和Map是JavaScript提供的用於存儲複雜數據結構的新標準。

此外,使用這些數據結構還消除了使用第三方庫(如Lodash)的需要,因為這些新的數據結構默認提供了.has()和.delete()等方法。

圖源:unsplash

Array和Object在任何意義上都不是過時的,不過使用Set和Map肯定是處理數據更好的方法,尤其是在構建大型複雜應用程式時。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • JavaScript中的Array.flatMap你知道嗎?
    本文轉載自【微信公眾號:前端人,ID:FrontendPeople】原文:samanthaming.com/tidbits/80-flatmap翻譯:虎克小哥哥在我以前眼裡JavaScript扁平一個數組,還是有些複雜的,不過在ES2019中引入了一種使數組扁平的新方法。並且有一個depth參數,您可以傳入任何級別的嵌套。
  • JavaScript和Underscore.js在PHP中輸入方法 - 智能甄選
    你喜歡用JavaScript編寫代碼嗎,但是對於某些項目必須使用PHP嗎?請繼續閱讀以了解如何使用有趣的圖書館將兩者結合起來。自2000年以來我一直在使用PHP,並且使用JavaScript的時間更長。在過去的十年裡,JavaScript已經發生了巨大的變化。
  • Java中的Set、List、Map的用法與區別
    >set.add(s1); set.add(s2); set.add(s3); System.out.println(set.size());//列印集合中對象的數目為 2。}} List(列表):List的特徵是其元素以線性方式存儲,集合中可以存放重複對象。
  • 使用Spark探索經典數據集MovieLens
    前言MovieLens數據集包含多個用戶對多部電影的評級數據,也包括電影元數據信息和用戶屬性信息。這個數據集經常用來做推薦系統,機器學習算法的測試數據集。尤其在推薦系統領域,很多著名論文都是基於這個數據集的。(PS: 它是某次具有歷史意義的推薦系統競賽所用的數據集)。
  • 前端javaScript開發:array數組的for、map和foreach的區別
    forEach()和map()兩個方法都是ECMAScript5中Array引進的新方法,主要作用是對數組的每個元素執行一次提供的函數,但是它們之間還是有區別的。,遍歷數組是最常用的,我項目組裡面很多新同事一般都是用for循環來遍歷數組,如下:<script>var arr=["a","b","c","d"];for (var i=0;i<arr.length;i++){console.log(arr[i]);}</script>運行結果如下:forEach方法下面就看看用
  • 計算機中的Map接口
    在計算機中想到集合和容器,我們應該想到List,Set,Queue隊列,Map這幾個集合容器。而我們在其中這幾個當中選取適合裝我們所需的數據。舉個生活的小李子,提水,你想到的是什麼?你第一反應想到的應該是桶這一類的東西,我覺得你不會想到用缸這一龐然大物。以現實生活中的例子反應到計算機中,就通俗易懂了!
  • 數據可視化發現了吃雞的秘密
    這種遊戲對我來說就是一個讓我明白原來還有這種死法的遊戲。但是玩歸玩,還是得假裝一下我沉迷學習,所以今天就用吃雞比賽的真實數據來看看如何提高你吃雞的概率。那麼我們就用python和R做數據分析來回答以下的靈魂發問?首先來看下數據:
  • 用RNN和TensorFlow創作自己的《哈利波特》小說
    我將這七本書合併到一個名為「harrypotter.txt」的文本文件中,你也可以挑選你喜歡的任何一本來訓練模型。通過使用 map 方法對每個批處理應用一個簡單的函數,可以創建輸入和目標:seq_length = 100examples_per_epoch = len(text)//(seq_length+1)char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)sequences = char_dataset.batch
  • 大數據挖掘算法——時間衰變算法
    在分析用戶的商品推薦時,我們會選擇動手實踐其中的熵權重算法和時間衰變算法,最終結合業務的實際場景重新組合一個綜合模型。1.數據源的獲取這裡會考慮從HBase中讀取數據源,具體數據特徵會涉及用戶ID、商品類目、寶貝、行為類型、次數和操作時間。
  • 如何用Tensorflow object-detection API訓練模型,找到聖誕老爺爺?
    你是否在期待聖誕老人和他的禮物呢?你想知道哪裡可以找到聖誕老人嗎?本文將教會你如何通過Tensorflow object-detection API訓練自己的目標檢測模型(object detector),來找到聖誕老人。
  • Python中的函數式編程教程,學會用一行代碼搞定
    這裡有兩個方法:class Counter:    def __init__(self, low, high):        # set class attributes inside the magic method __init__        # for "inistalise"        self.current = low
  • 霍思燕和兒子吃飯吃出雙下巴被嘲,胖子沒春天了嗎?
    合理的使用內存,有助於提升機器的性能和穩定性。本文主要介紹 Linux 內存組織結構和頁面布局,內存碎片產生原因和優化算法,linux 內核幾種內存管理的方法,內存使用場景以及內存使用的那些坑。從內存的原理和結構,到內存的算法優化,再到使用場景,去探尋內存管理的機制和奧秘。
  • 數據結構+算法(第10篇)叉堆「功夫熊貓」的速成之路
    提到:樹是一種分層分類的數據結構,用途是查找和排序。而與查找和排序密切相關的就是求最值(最大值或者最小值)。今天我們就來介紹一個與最值相關的數據結構——二叉堆。儘管網上或者相關的算法書均有對二叉堆算法的介紹,但大部分只停留在how的階段,並未對一些關鍵細節進行why的深究。比如:為什麼二叉堆的算法都使用數組作為數據結構,而不是鍊表?
  • 像動態蜘蛛網這樣麻煩的樣條動畫,用這個C4D腳本也許點兩下滑鼠就可以輕鬆做好
    import c4d#script to select first and last point of selected splinesdef main():    doc = c4d.documents.GetActiveDocument() #set context (this document)    selo = doc.GetActiveObjects
  • 用Python做股市數據分析(一)
    比如如何用pandas從雅虎財經獲得數據, 可視化股市數據,平局數指標的定義,設計移動平均交匯點分析移動平均線的方法,回溯測試, 基準分析法。最後一篇博文會包含問題以供練習。第一篇博文會包含平局數指標以及之前的內容。 注意:本文僅代表作者本人的觀點。文中的內容不應該被當做經濟建議。我不對文中代碼負責,取用者自己負責。