【譯】Immutable.js: Map
Immutable's Map與JavaScript物件很相似,但是如果你不知道它是如何工作的話,它可能會嚴重地影響你。這篇文章是第一次深入瞭解Immutable Maps,向您展示如何以正確的方式使用它們。
認識認識 Immutable 中的Map
一個不可變對映是鍵/值對的無序集合,乍一看似乎與JavaScript物件相似。但是,它具有以下附加屬性:
- 您可以迭代Map中的鍵
- 迭代的鍵的順序不會改變(儘管你不知道什麼順序會提前)
- 所有的鍵都被轉換成字串。
- 一個鍵可以是任何型別的 - 甚至是NaN和一個數組
- 如果Immutable.is(map1,map2)返回true,則兩個對映是相同的
- 一個不可變的集合(例如List,Map,Seq等)可以是一個Key
Create an empty Map
// Empty Map:
const map = Immutable.Map();
// Output:
map;
Create a populated Map of data
您可以使用Map()
建構函式或Map.of()
方法根據現有資料建立Map,具體取決於您用於建立Map的資料型別:
Map.of()
從一組函式引數中建立Map時使用,每對引數都被解釋為一個鍵和一個值;Map()
使用其他方式建立Map時使用。
Create a new Map from…
…a JavaScript Array
要從陣列建立一個新的Map,實際上需要一個數組中的陣列,每個陣列項都是一個元組(即有兩個值)。每個陣列項的第一個值將被用作MAP中的一個鍵,第二個項將是它的值。
// New Map from JavaScript array
const avengersArray = [
['heroName1', 'ironMan'],
['heroName2', 'captainAmerica']
];
const avengersMap = Immutable.Map(avengersArray);
// Output:
avengersMap;
{
heroName1: "ironMan",
heroName2: "captainAmerica"
}
重要提示:請記住,金鑰名稱必須是唯一的。嘗試在上面的程式碼中將“heroName2”更改為“heroName1”,看看會發生什麼。這是因為不可變將覆蓋它看作是一個重複的金鑰。
…a JavaScript Object
// New Map from JavaScript object
const avengersObj = {
ironMan: 'Tony Stark',
captainAmerica: 'Steve Rogers'
};
const avengersMap = Immutable.Map(avengersObj);
// Output:
{
captainAmerica: "Steve Rogers",
ironMan: "Tony Stark"
}
...深度巢狀的JavaScript物件或JSON編碼的資料
Immutable的Map
不能在深度巢狀的物件上工作,因為它只會進行淺轉換(例如,obj.key
中的鍵將被轉換為Map,但obj.key.subkey
中的子鍵將保持不變 - 也就是說,如果subkey
是一個JavaScript物件,它將保持一個JavaScript物件,而不是一個不可變的對映)。
為了從一個複雜的物件或JSON編碼的資料建立一個新的Map,因此,您需要使用fromJS()。
// New Map from deeply nested JavaScript object
const avengers = {
hero1: {
ironMan: {
realName: 'Tony Stark'
}
},
hero2: {
captainAmerica: {
realName: 'Steve Rogers'
}
}
};
// Create the Map
const avengersMap = Immutable.Map(Immutable.fromJS(avengers));
// Test that we have a deeply nested Map
const ironMan = avengersMap.getIn(['hero1', 'ironMan']);
// Output:
Immutable.Map.isMap(ironMan);
嘗試從上面的程式碼中刪除Immuable.fromJS,你應該看到輸出轉為false。這是因為,如果沒有fromJS(),深層巢狀的物件將不會被轉換為一個Map。
…a set of function arguments
您可以從任意數量的函式引數建立一個Map,每個引數對被解釋為一個鍵/值對。只要記住用Map.of()
建立你的Map
// New Map from function arguments
const avengersMap = Immutable.Map.of(
'ironMan', 'Tony Stark', 'captainAmerica', 'Steve Rogers'
);
// Output:
avengersMap;
…a JavaScript iterator
可以使用內建的(例如一個數組)或使用者定義的任何ES6可迭代物件來建立一個新的不可變對映。
// New Map from existing JavaScript iterator (Array.map example)
// Note: an ES6 object is not an iterator, so we'll use an array instead
const avengersArray = ['ironMan' , 'captainAmerica'];
const avengersMap = Immutable.Map(avengersArray.map(
(item, index) => ([ 'heroName' + index, item ])));
// Output:
avengersMap;
…an Immutable List
就像從陣列建立Map一樣,List必須包含List列表,每個List項都是一個元組,它將被Map用作鍵/值對。
// New Map from existing List
const avengersList = Immutable.List([['heroName1', 'ironMan'], ['heroName2', 'captainAmerica']]);
const avengersMap = Immutable.Map(avengersList);
// Output:
avengersMap;
{
heroName1: "ironMan",
heroName2: "captainAmerica"
}
…an Immutable Map
// New Map from existing Map
const avengersMap = Immutable.Map({
hero1: 'ironMan',
hero2: 'captainAmerica',
hero3: 'blackWidow'
});
const newAvengersMap = Immutable.Map(avengersMap);
// Output:
newAvengersMap;
{
hero1: "ironMan",
hero2: "captainAmerica",
hero3: "blackWidow"
}
…other Immutable objects
您可以使用任何不可變物件建立新的Map,其中包括:
- List
- Map
- OrderedMap
- Set
- OrderedSet
- Stack
- Record
OrderedMap
一個OrderedMap和Map一樣,但是保證迭代的鍵順序總是一樣的。您可以使用Map執行的其他操作,OrderedMap也可以使用。
請注意,OrderedMap比Map更慢,所以如果你不關心被迭代的鍵的順序,可以使用Map。
Get, Set, Update and Delete Map properties
如你所看到的,建立地圖可能會非常複雜。一旦建立,他們提供了一個強大的方式來執行資料操作。本系列的下一篇文章將介紹如何從Map中獲取,設定,更新和刪除。
相關推薦
【譯】Immutable.js: Map
Immutable's Map與JavaScript物件很相似,但是如果你不知道它是如何工作的話,它可能會嚴重地影響你。這篇文章是第一次深入瞭解Immutable Maps,向您展示如何以正確的方式使用它們。 認識認識 Immutable 中的Map 一個不可變對映是鍵/值對的無序集合,乍一看似乎與JavaS
【譯】Immutable.js : 操作Map
我們知道如何建立Immutable Map,我們來看看如何從中獲取資料,以及如何新增和刪除專案,而不用改變它們。 Getters Get a value from a Map with get() const avengersMap = Immutable.Map({ ironMan: 'Tony St
【譯】Immutable.js : 合併Map 7
Immutable提供了多個方法用於進行合併兩個及其以上的MAP物件。然而,選擇正確的方法是令人困惑的,除非你有一個非常棒的指南和豐富的例子 - 這些都是本教程的內容。 Merging Maps 將兩個或更多Map合併在一起有六種不同的方法。使用它們如下: originalMap.merge(Map1, M
【譯】Immutable.js : 操作 Set -8
不可變集提供了強大的集合操作,如相交,聯合和減法。本教程將向您展示如何使用它們,以及何時使用它們來代替合併列表 什麼時候使用Sets和Union,Intersect和Subtract方法 Set的獨特性質是其值始終是唯一的。不可變的設定方法強制這種唯一性,並會自動防止重複被新增到一個集,而不會引發異常。 當使
【譯】Immutable.js: 合併 List
在之前的文章中,我們已經看到了如何建立一個新的列表,以及如何新增,插入和刪除專案。現在是時候學習更高階一點的技能了 —— 合併兩個或更多列表的方式。 注意:記住Immutable不會改變任何被合併的列表。合併列表總是從任何合併函式返回,使合併操作中涉及的任何列表完全不變。因此,無論何時您看到諸如“合併列表..
【譯】Node.js中的Event Loop
原文連結: flaviocopes.com/node-event-… 指南 為了瞭解Node,Event Loop(後面我會翻譯成“事件迴圈”)是其中最重要的方面。 為什麼它如此重要?因為它表明了Node是怎樣做到非同步並且擁有非堵塞的I/O操作,當然也是使得Node的“殺手級”應用得以成功的重要原因。
【nodejs原理&原始碼賞析(7)】【譯】Node.js中的事件迴圈,定時器和process.nextTick
目錄 Event Loop 是什麼? Event Loop 基本解釋 事件迴圈階段概覽 事件迴圈細節 timers pending callbacks poll
【譯】itertools
body 註意 rst iterable eap 最短 wait 映射 nes 1、Itertools模塊叠代器的種類 1.1 無限叠代器: 叠代器 參數 結果 示例 count() start, [step] start, start+step, start+
【譯】巧用 CSS 變量實現自動前綴
實現 這也 ria var 選擇符 http spa style 自動 轉https://www.h5jun.com/post/autoprefixing-with-css-variables-lea-verou.html 最近,當我在制作 markapp.io 這個小網
【譯】SAE:一個大規模網絡的社交分析引擎
圖計算 表達 推斷 strong 的人 int 識別 表現 gen Yang Yang, Jianfei Wang, Yutao Zhang, Wei Chen, Jing Zhang, Honglei Zhuang, Zhilin Yang, Bo Ma, Zhanpen
[轉] 【譯】讓人傾倒的 11 個 npm trick
都是 聲明 exports wrap ins log int eat license 【From】 https://segmentfault.com/a/1190000006804410 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/ar
【譯】Attacking XML with XML External Entity Injection (XXE)
macintosh file flat block inpu inject 有一種 這樣的 content 原文鏈接:Attacking XML with XML External Entity Injection (XXE) XXE:使用XML外部實體註入攻擊XML
【前端】Vue.js經典開源項目匯總
查詢 可見 專業 codec ssa mark 高級 coffee init Vue.js經典開源項目匯總 原文鏈接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什麽? Vue.js(讀音 /vju?/, 類似
【前端】vue.js實現按鈕的動態綁定
case ctype html 們的 ast pre cal 防止 得到 vue.js實現按鈕的動態綁定 實現效果: 實現代碼以及註釋: <!DOCTYPE html> <html> <head> <title>按鈕
【轉】使用js觸發事件
rda ctype rem odi scroll cancel script 事件 some 如果大家將一張網頁看成一個form的話,大致上就成了一個web form的模型。在win form 下要想手動觸發某一個對象的事件是很簡單的,只要發送一條消息即可達成。
【整理】原生js和jQ獲取窗口寬高及滾動條的方法和函數
javascript 滾動條 jq 窗口距離 原生js和jQ獲取窗口寬高及滾動條的方法和函數 一。原生js獲取 1.實際寬高(不包括工具欄,滾動條的視口高度,ie6.7.8不支持) window.innerHeight window.innerWidth 2.顯示屏寬高 screen.h
【轉載】Ajax JS 跨域請求
-h 資源 pla dom light data 常用 clas json 原文: 簡單的ajax請求:http://blog.csdn.net/net_lover/article/details/5172509 復雜的ajax請求:http://blog.csdn.net
【譯】Flink + Kafka 0.11端到端精確一次處理語義的實現
網絡 人員 回調 per 算法 connect commit int 學習 本文是翻譯作品,作者是Piotr Nowojski和Michael Winters。前者是該方案的實現者。 原文地址是https://data-artisans.com/blog/end-to-en
【譯】gRPC負載均衡
github bsp 服務器配置 維護 外部 服務 size 響應 均衡器 原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC負載均衡 範圍 本文檔解釋了gPRC的負載均衡
【譯】gRPC的服務配置
false IT load 用戶 com 大於 例如 相關 dev 原文地址:https://github.com/grpc/grpc/blob/master/doc/service_config.md gRPC的服務配置 目標 服務配置是一種允許服務擁有者去發布參數以