1. 程式人生 > >【譯】Immutable.js: Map

【譯】Immutable.js: Map

Immutable's Map與JavaScript物件很相似,但是如果你不知道它是如何工作的話,它可能會嚴重地影響你。這篇文章是第一次深入瞭解Immutable Maps,向您展示如何以正確的方式使用它們。

認識認識 Immutable 中的Map

一個不可變對映是鍵/值對的無序集合,乍一看似乎與JavaScript物件相似。但是,它具有以下附加屬性:

  1. 您可以迭代Map中的鍵
  2. 迭代的鍵的順序不會改變(儘管你不知道什麼順序會提前)
  3. 所有的鍵都被轉換成字串。
  4. 一個鍵可以是任何型別的 - 甚至是NaN和一個數組
  5. 如果Immutable.is(map1,map2)返回true,則兩個對映是相同的
  6. 一個不可變的集合(例如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的服務配置 目標 服務配置是一種允許服務擁有者去發布參數以