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

【譯】Immutable.js : 合併Map 7

Immutable提供了多個方法用於進行合併兩個及其以上的MAP物件。然而,選擇正確的方法是令人困惑的,除非你有一個非常棒的指南和豐富的例子 - 這些都是本教程的內容。

Merging Maps

將兩個或更多Map合併在一起有六種不同的方法。使用它們如下:

  • originalMap.merge(Map1, Map2, Map3, ...Map-n) —— 將Maps合併在一起,將合併Maps的鍵/值對新增到originalMap的鍵/值對中,如果兩個鍵重複,則使用最後一個Map的值。巢狀的MAP不會被合併。
  • originalMap.mergeWith((originalMapValue, mergedMapValue, key) => { /* conflict resolution */ }, Map1, Map2, Map3, ...Map-n);
    —— 合併多個Map,但是如果有衝突,你可以自行控制使用哪個值。
  • originalMap.mergeDeep(Map1, Map2, Map3, ...Map-n) 合併巢狀的MAP
  • originalMap.mergeDeepWith((originalMapValue, mergedMapValue, key) => { /* conflict resolution */ }, Map1, Map2, Map3, ...Map-n); 深層次合併,如有衝突可自行控制合併值
  • const mergedMap = originalMap.mergeIn([keyPath], Map1, Map2, Map3, ...Map-n);
    合併keypath位置中的MAP,不合並巢狀的
  • const mergedMap = originalMap.mergeDeepIn([keyPath], Map1, Map2, Map3, ...Map-n); 在由keyPath標識的位置深度合併

Map.merge()

通過將合併Map的鍵/值對新增到要合併到的Map的鍵/值對中,將兩個Map合併在一起。如果任何Maps的鍵都相同,則將使用最後一個要合併的Map中的重複鍵的值。

// Merge 
const avengers = Immutable.Map({
  ironMan: 'Tony Stark',
  captainAmerica: 'Steve Rogers'
});

const mergingAvengers = Immutable.Map({
  blackWidow: 'Natasha Romanova',
  theHulk: 'Bruce Banner'
});

const mergedAvengers = avengers.merge(mergingAvengers);

// Output:

{
  blackWidow: "Natasha Romanova",
  captainAmerica: "Steve Rogers",
  ironMan: "Tony Stark",
  theHulk: "Bruce Banner"
}

mergeWith()

將兩個或更多Map合併在一起,但是如果存在任何衝突,則可以控制使用哪個值。使用它如下:

const mergedMap = originalMap.Map((originalMapValue, mergedMapValue, key) => { /* conflict resolution */ }, mergedMap);

在下面的例子中,兩個Map將被正常合併,除非:

  • 合併Map的值是未定義的
  • "ironMan" 為key, 這個值不能變
// Merge two Maps using mergeWith
const avengers = Immutable.Map({
  ironMan: 'Tony Stark',
  captainAmerica: undefined,
  blackWidow: 'Natasha Romanova',
});

const mergingAvengers = Immutable.Map({
  theHulk: 'Bruce Banner',
  blackWidow: undefined,
  ironMan: 'imposter!',
  captainAmerica: 'Steve Rogers',
});

const mergedAvengers = avengers.mergeWith((prev, next, key) => {
  // If mergingMap's value is undefined, return the originalMap's value
  if(!next) {
    return prev;
  }
  // If the key = 'ironMan', then use the originalMap's value
  if(key==='ironMan') {
    return prev;
  }
  // otherwise, use the mergingMap's value
  return next;
}, mergingAvengers);

// Output:

{
  blackWidow: "Natasha Romanova",
  captainAmerica: "Steve Rogers",
  ironMan: "Tony Stark",
  theHulk: "Bruce Banner"
}

mergeDeep()

mergeDeep()將兩個或更多的地圖合併在一起,呃,深深的。使用標準的merge(),巢狀的地圖不會合並在一起 - 只有頂級Map中的鍵合併。通過mergeDeep(),無論巢狀層次結構的深度如何,所有巢狀的地圖都將被遞迴合併。

為了看到這一點,下面的例子顯示mergeDeep()將兩個復仇者合併在一起。嘗試改變mergeDeep函式來合併,看看會發生什麼。

// Merge two Maps using mergeDeep
const ironMan = Immutable.fromJS({
  heroes: {
    ironMan: {
      name: 'Tony Stark'
    },
    captainAmerica: {
      name: 'Steve Rogers'
    }
  }
});

const mergingMan = Immutable.fromJS({
  heroes: {
    ironMan: {
      partner: 'Pepper Potts'
    }
  }
});

const mergedMan = ironMan.mergeDeep(mergingMan);

// Output:

[object Object] {
  heroes: [object Object] {
    captainAmerica: [object Object] { ... },
    ironMan: [object Object] { ... }
  }
}

mergeDeepWith()

mergeDeepWith()將兩個或更多的地圖深度合併在一起(包括巢狀的地圖),並且可以控制在合併的地圖中存在重複鍵的情況下保留哪個值。

// Merge two Maps using mergeDeepWith
const avengers = Immutable.fromJS({
  heroes: {
    ironMan: {
      name: 'Tony Stark'
    },
    captainAmerica: {
      name: 'Steve Rogers'
    }
  }
});

const mergingAvengers = Immutable.fromJS({
  heroes: {
    ironMan: {
      name: 'Tony Starkless',
      partner: 'Pepper Potts'
    },
    captainAmerica: {
      name: 'Chris Evans'
    }
  }
});

const mergedAvengers = avengers.mergeDeepWith((prev, next, key) => {
  // If the key = 'name', then use the originalMap's value
  if(key==='ironMan') {
    return prev;
  }
  // otherwise, use the mergingMap's value
  return next;
}, mergingAvengers);


// Output:

{
  heroes: {
    captainAmerica: [object Object] { 
        name:"Chris Evans"
    },
    ironMan: [object Object] { 
        name:"Tony Starkless",
        partner: "Pepper Potts"
        
    }
  }
}

試試將 mergeDeepWith 改為 mergeWith 看看會發生什麼

mergeIn()

將兩個或更多Map合併在一個巢狀Map的特定點上。使用它如下:

const mergedMap = originalMap.mergeIn([keyPath], Map1, Map2, Map3, ...Map-n);

// Merge two Maps using mergeIn
const avengers = Immutable.fromJS({
  heroes: {
    ironMan: {
      name: 'Tony Stark'
    },
    captainAmerica: {
      name: 'Steve Rogers'
    }
  }
});

const mergingAvengers = Immutable.fromJS({
  partner: {
    realName: 'Pepper Potts',
    heroName: 'hera'
  }
});

const mergedAvengers = avengers.mergeIn(['heroes', 'ironMan'], mergingAvengers);

// Output:
{"heroes":{
    "ironMan":{
        "name":"Tony Stark",
        "partner":{
            "realName":"Pepper Potts",
            "heroName":"hera"
            
        }
    },
    "captainAmerica":{
        "name":"Steve Rogers"
    }
}}

mergeDeepIn()

將兩個或更多巢狀的Map在巢狀的Map中的特定點合併在一起。使用它如下:

const mergedMap = originalMap.mergeDeepIn([keyPath], Map1, Map2, Map3, ...Map-n);

這與mergeIn有著微妙的差別 - 實際上,它非常微妙,我最終通過不可變的原始碼尋找任何差異!

// Merge two Maps using mergeDeepIn
const avengers = Immutable.fromJS({
  heroes: {
    type: {
      human: {
        ironMan: {
          name: 'Tony Stark'
        },
        captainAmerica: {
          name: 'Steve Rogers'
        }
      },
      god: {
        thor : {
          name: 'Thor'
        }
      }
    },
  }
});

const mergingAvengers = Immutable.fromJS({
  human :{      
    blackWidow: {
      name: 'Natasha Romanova'
    }
  }
});

const mergedAvengers = avengers.mergeDeepIn(['heroes', 'type'], mergingAvengers);

// Output:

{"heroes":{
    "type":{
        "human":{
            "ironMan":{
                "name":"Tony Stark"
            },
            "captainAmerica":{
                "name":"Steve Rogers"
            },
            "blackWidow":{
            "name":"Natasha Romanova"
            }
        },
        "god":{
            "thor":{"name":"Thor"}
        }
    }
}}

相關推薦

Immutable.js : 合併Map 7

Immutable提供了多個方法用於進行合併兩個及其以上的MAP物件。然而,選擇正確的方法是令人困惑的,除非你有一個非常棒的指南和豐富的例子 - 這些都是本教程的內容。 Merging Maps 將兩個或更多Map合併在一起有六種不同的方法。使用它們如下: originalMap.merge(Map1, M

Immutable.js : 操作Map

我們知道如何建立Immutable Map,我們來看看如何從中獲取資料,以及如何新增和刪除專案,而不用改變它們。 Getters Get a value from a Map with get() const avengersMap = Immutable.Map({ ironMan: 'Tony St

Immutable.js: 合併 List

在之前的文章中,我們已經看到了如何建立一個新的列表,以及如何新增,插入和刪除專案。現在是時候學習更高階一點的技能了 —— 合併兩個或更多列表的方式。 注意:記住Immutable不會改變任何被合併的列表。合併列表總是從任何合併函式返回,使合併操作中涉及的任何列表完全不變。因此,無論何時您看到諸如“合併列表..

Immutable.js: Map

Immutable's Map與JavaScript物件很相似,但是如果你不知道它是如何工作的話,它可能會嚴重地影響你。這篇文章是第一次深入瞭解Immutable Maps,向您展示如何以正確的方式使用它們。 認識認識 Immutable 中的Map 一個不可變對映是鍵/值對的無序集合,乍一看似乎與JavaS

Immutable.js : 操作 Set -8

不可變集提供了強大的集合操作,如相交,聯合和減法。本教程將向您展示如何使用它們,以及何時使用它們來代替合併列表 什麼時候使用Sets和Union,Intersect和Subtract方法 Set的獨特性質是其值始終是唯一的。不可變的設定方法強制這種唯一性,並會自動防止重複被新增到一個集,而不會引發異常。 當使

nodejs原理&原始碼賞析(7Node.js中的事件迴圈,定時器和process.nextTick

目錄 Event Loop 是什麼? Event Loop 基本解釋 事件迴圈階段概覽 事件迴圈細節 timers pending callbacks poll

Node.js中的Event Loop

原文連結: flaviocopes.com/node-event-… 指南 為了瞭解Node,Event Loop(後面我會翻譯成“事件迴圈”)是其中最重要的方面。 為什麼它如此重要?因為它表明了Node是怎樣做到非同步並且擁有非堵塞的I/O操作,當然也是使得Node的“殺手級”應用得以成功的重要原因。

使用 LINQ 合併 IEnumerable 序列

Zip 方法允許把序列中的元素通過交織將 IEnumerable 序列連線在一起。Zip 是一種基於 IEnumerable 的擴充套件方法。例如,將具有年齡的名稱集合壓縮在一起: var names = new[] { "John", "Sarah", "Amrit" }; var ages = ne

7. Java反射——私有欄位和私有方法

 ===========================================================================================      儘管普遍的觀點是不能直接訪問私有欄位和私有方法的,實際上通過Java反射是可以訪問其他類的私有欄位和私有方法

宣告推出.NET Core 3.0 Preview 7(英雄的黎明)

今天,我們宣佈推出.NET Core 3.0 Preview 7。我們已經從建立新特性階段過渡到了完善版本階段。對於接下來的預覽版,我們將把重點放在質量(改進)上。 在Windows,macOS和Linux上下載.NET Core 3.0 Preview 7。 .NET Core 3.0發行說明 A

在React中實現條件渲染的7種方法

原文地址:https://scotch.io/tutorials/7-ways-to-implement-conditional-rendering-in-react-applications 藉助React,我們可以構建動態且高度互動的單頁應用程式,充分利用這種互動性的一種方法是通過條件渲染。 目錄

Linux CentOS6.5安裝Python2.7以及pip等工具

自己 lin 存在 lean prefix nbsp ase 路徑 details 原文地址http://blog.csdn.net/u012538536/article/details/47360929。 CentOS6.5下是原來就有python的,我的鏡像裏面自帶的

itertools

body 註意 rst iterable eap 最短 wait 映射 nes 1、Itertools模塊叠代器的種類 1.1 無限叠代器: 叠代器 參數 結果 示例 count() start, [step] start, start+step, start+

mybatis循環map的一些技巧

ava bsp batis class key log net 而不是 地址 原文地址:http://blog.csdn.net/linminqin/article/details/39154133 循環key: <foreach collection="con

巧用 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>按鈕