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

【譯】Immutable.js: 合併 List

在之前的文章中,我們已經看到了如何建立一個新的列表,以及如何新增,插入和刪除專案。現在是時候學習更高階一點的技能了 —— 合併兩個或更多列表的方式。

注意:記住Immutable不會改變任何被合併的列表。合併列表總是從任何合併函式返回,使合併操作中涉及的任何列表完全不變。因此,無論何時您看到諸如“合併列表...”或“覆蓋originalList”之類的片語,它都是被包含的列表的副本,這些副本正在發生變化(並最終作為合併列表返回)。

列表的4個合併功能

Immutable提供了四個獨立的合併函式:

  • originalList.merge(List1, List2, List3...List-n)
    通過用List1(和List2,List3 ... List-n)中的專案覆蓋originalList的相應位置上的每個專案,返回合併列表。
  • mergeWith(conflictResolutionFn, List1, List2, List3...List-n)將列表合併在一起,但使用傳入的conflictResolutionFn()來解決衝突.
  • mergeDeep(List1, List2, List3...List-n)將列表合併在一起,如果存在衝突,則合併衝突專案
  • mergeDeepWith(conflictResolutionFn, List1, List2, List3...List-n)
    將列表合併在一起,如果存在衝突,則使用傳入的conflictResolutionFn()來解決衝突。

以下是如何使用這些功能。

merge()

合併兩個列表

merge()使用合併列表中存在於相應索引處的值覆蓋List中每個專案的值。

// Merge two lists together with merge

const oldAvengers = Immutable.List(['ironMan', 'captainAmerica', 'theHulk']);
const newAvengers = Immutable.List(['scarletWitch', 'vision']);

// Merge all the lists!
oldAvengers.merge(newAvengers);

這是發生了什麼事情:

  • oldAvengers[0] = 'ironMan'
  • newAvengers[0] = 'scarletWitch'
  • 列表中的每個專案(即oldAvengers)的值被相應索引(即索引0)處的合併列表(即newAvengers)中的值覆蓋。
  • 所以,'scarletWitch'(newAvengers [0]處的值)會覆蓋'ironMan'(oldAvengers [0]處的值)。 'vision'重寫'captainAmerica';但新的newAvengers[2]並不存在,所以oldAvengers[2](即“theHulk)保持不變。

將兩個以上的列表合併在一起

將兩個以上的列表合併在一起時,列表將依次合併,最後一個列表最終將覆蓋所有以前的列表。

// Merge more than one List together
​
const oldAvengers = Immutable.List(['ironMan', 'captainAmerica', 'theHulk']);
const newAvengers = Immutable.List(['scarletWitch', 'vision']);
const newerAvengers = Immutable.List(['antMan']);
​
// Merge all the lists!
oldAvengers.merge(newAvengers, newerAvengers);

mergeWith()

mergeWith()讓您提供自己的衝突解決功能,這樣您就可以使合併更加智慧化,而不僅僅是通過索引值覆蓋,並且更加具體地滿足您的需求。使用方法:

list1.mergeWith(conflictResolutionFn(list1Value, list2Value, index){}, list2)

示例

1、合併列表並根據專案值解決衝突

// Merge lists only if item is not null with mergeWith()
​
const oldAvengers = Immutable.List(['ironMan', 'captainAmerica', 'theHulk']);
const newAvengers = Immutable.List(['scarletWitch', null, 'vision']);
​
// Merge only if newAvenger value is not null
oldAvengers.mergeWith((oldAvenger, newAvenger, index) => {
  return (newAvenger === null) ? oldAvenger : newAvenger
}, newAvengers);

2、根據索引合併列表並解決衝突

// Merge every other List item with mergeWith()

const oldAvengers = Immutable.List(
  ['ironMan', 'captainAmerica', 'blackWidow', 'theHulk']
);
const newAvengers = Immutable.List(
  ['scarletWitch', 'vision', 'antMan', 'falcon']
);

// Merge every other item
oldAvengers.mergeWith((oldAvenger, newAvenger, index) => {
  return (index % 2) ? newAvenger : oldAvenger
}, newAvengers);

mergeDeep()

merge 做啥 mergeDeep 就幹啥,但是對於巢狀列表,可以迭代線個層次中的項。

合併兩個巢狀列表,讓Immutable解決衝突

merge()使用相應索引處存在的合併List中的值覆蓋List中每個專案的值。但是,在巢狀列表的情況下,這可能會覆蓋整個巢狀List,而不是單個專案。

-- Demo

// Merge two nested Lists together with merge()

const oldAvengers = Immutable.fromJS(
  [
    ['ironMan', ['captainAmerica']],
    ['theHulk', ['Thor']]
  ]);

const newAvengers = Immutable.fromJS(
  [
    ['vision'],
    [
      ['blackWidow']
    ]
  ]);

// This overwrites everything in oldAvengers
oldAvengers.merge(newAvengers);

** output: **
[["vision"], [["blackWidow"]]]

newAvengers List專案覆蓋oldAvengers中的所有相應專案(例如'vision'覆蓋'ironMan'和巢狀List'captainAmerica')。

要保留一個List的巢狀,並針對一個特定的巢狀級別,你需要使用mergeDeep:

// Merge two nested Lists together with mergeDeep()

const oldAvengers = Immutable.fromJS(
  [
    ['ironMan', ['captainAmerica']],
    ['theHulk', ['Thor']]
  ]);

const newAvengers = Immutable.fromJS(
  [
    ['vision'],
    [
      ['blackWidow']
    ]
  ]);

// This leaves the nested Lists intact
oldAvengers.mergeDeep(newAvengers);

OUTPUT *********************************************************
[["vision", ["captainAmerica"]], [["blackWidow"], ["Thor"]]]

mergeDeepWith()

如果您需要自行決定應該合併哪個巢狀專案,請使用mergeDeepWtih:

將兩個巢狀列表合併在一起,自己解決衝突

list1.mergeDeepWith(conflictResolutionFn(list1Value, list2Value, index){}, list2)

// Merge two nested Lists together with mergeDeepWith()

const oldAvengers = Immutable.fromJS(
  [
    ['ironMan', ['captainAmerica']],
    ['theHulk', ['Thor']]
  ]);

const newAvengers = Immutable.fromJS(
  [
    ['vision'],
    ['blackWidow', 'Loki']        
  ]);

// Loki can't replace Thor
oldAvengers.mergeDeepWith((prev, next, index) => {
  return (next === 'Loki') ? prev : next
}, newAvengers);


OUTPUT ************************************************************
[["vision", ["captainAmerica"]], ["blackWidow", ["Thor"]]]

合併可能會非常棘手,有時候會讓你頭腦發熱,尤其是對於深度巢狀的列表。但是,使用自己的衝突解決功能的能力為操縱資料提供了強大的機制。

相關推薦

Immutable.js: 合併 List

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

Immutable.js : 合併Map 7

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

Immutable.js : 操作 Set -8

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

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

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

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

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

Python將多個list合併為1個list

1可以使用"+"號完成操作輸出為:[1, 2, 3, 8, 'google', 'com']2.使用extend方法、輸入相同3使用切片輸出相同PS:len(l1)代表要將l2插入l1中的位置例如輸出為:又如:輸出為:總結:第一種方方法思路比較清晰,就是運算子的過載;第二種方

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

Leetcode203. Remove Linked List Elements

tno lee div node move nod public amp ret Remove all elements from a linked list of integers that have value val. Example Given: 1 -->