【譯】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);
originalMap.mergeDeep(Map1, Map2, Map3, ...Map-n)
合併巢狀的MAPoriginalMap.mergeDeepWith((originalMapValue, mergedMapValue, key) => { /* conflict resolution */ }, Map1, Map2, Map3, ...Map-n);
深層次合併,如有衝突可自行控制合併值const mergedMap = originalMap.mergeIn([keyPath], Map1, Map2, Map3, ...Map-n);
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原理&原始碼賞析(7)】【譯】Node.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>按鈕