【译】Immutable.js : 操作 Set -8

不可变集提供了强大的集合操作,如相交,联合和减法。本教程将向您展示如何使用它们,以及何时使用它们来代替合并列表

什么时候使用Sets和Union,Intersect和Subtract方法

Set的独特性质是其值始终是唯一的。不可变的设置方法强制这种唯一性,并会自动防止重复被添加到一个集,而不会引发异常。

当使用三个特定于Set的方法(union,intersect和subtract)时,一个Set真正进入自己的状态。

  • Set.union()将两个值的值组合在一起,确保不存在重复。 Union返回Set B的值与Set A的值,删除重复项。它不同于List.merge(),List.merge()覆盖列表A的值与列表B中存在于同一索引处的值。相反,Set.union()结合了两组值。
  • Set.intersect()提供了两个集合A和B,并返回一个只包含A和B中存在的值的集合。
  • Set.subtract()需要两个集合A和B,并返回一个只包含A中存在的值但不存在于B中的集合。

How to operate on an Immutable Set

原始值(number,string)

当执行Set操作时(即减法,相交或联合),您需要了解JavaScript如何处理相等性。使用JavaScript原始值(布尔值,数字,字符串,空值和未定义值),等同于您所期望的:例如,2总是等于2,而'string'=== string'。

Working with JavaScript Objects

但是,使用JavaScript对象则是非常不同的。具体而言,一个对象只有等于自己。使用相同的键和值创建两个独立的对象不会使它们相等。

这是因为对象是通过引用(即它们在内存中的位置)进行比较的,而基元是通过值进行比较的。如果两个数字具有相同的值,则认为它们是相等的。然而,具有相同值的两个对象将总是驻留在两个不同的存储器位置,因此不能相等。

const obj1 = { key: 'value' };
const obj2 = { key: 'value' }// The values assigned obj1 and obj2 reside in two different memory locations. 
// They are therefore not equal:
obj1 === obj2;// OUTPUTfalse

为什么这很重要?因为一个集合必须有唯一的值,为了检查重复,它需要知道(你也是这样!)是什么使一个值等于另一个值。在基元的情况下,它本身就是值,但是在对象的情况下,平等就是内存的位置。

// NOTE: does NOT work// Create a Set of objects, none of which are assigned to a variable
const avengersSet = Immutable.Set([{ blackWidow: 'Natasha Romanov' }, { captainAmerica: 'Steve Rogers' }]);// Try to remove blackWidow using the key/value pair, and it won't work
avengersSet.subtract([{ blackWidow: 'Natasha Romanov' }]);

在这个例子中传递给Set的每个对象都存在于一个特定的内存位置,但是因为它没有被分配给一个变量,所以没有办法引用它。仅仅使用键/值对作为subtract()方法中的参数是不够的,因为这只是在不同的内存位置创建单独的对象,因此具有不同的标识。

对于两个被视为相等的对象,您必须创建一个对象,为其分配两个不同的变量,然后比较这些变量是否相等。这样,内存中只有一个对象,分配给它的每个变量指向内存中的单个位置;因此,这两个变量是相等的,因为它们都指向相同的对象。

const obj1 = { key: 'value' };
const obj2 = obj1;
obj1 === obj2;// OUTPUT: true

将其应用于Set的函数,为了安全地使用对象集合中的相减(subtract),相交(intersect)或联合(union),我们必须创建一组分配的对象:也就是,一组变量,其中每个变量都被分配给一个对象,而不是一组对象直接。

// Create variables and assign them to objects
const blackWidow = {blackWidow: 'Natasha Romanov'
};const captainAmerica = {captainAmerica: 'Steve Rogers'
}// Create a Set of variables, each of which is assigned to an object
const avengersSet = Immutable.Set([captainAmerica, blackWidow]);// Output:
avengersSet.subtract([blackWidow]);[[object Object] {captainAmerica: "Steve Rogers"
}]

Working with Immutable objects (Map, List, Set, etc.)

由于使用JavaScript对象的困难,Immutable以Immutable.is()方法的形式为其对象(Map,List,Set等)提供了自己的等式方法,它将两个不可变对象视为等于if他们的价值是相等的。

也就是说,即使它们是两个不同的对象(即它们驻留在不同的存储器位置中),以下两个不可变映射也被视为相等:

// Create variables and assign them to objects
const obj1 = Immutable.Map({ key: 'value' });
const obj2 = Immutable.Map({ key: 'value' });Immutable.is(obj1, obj2);// OUTPUT: true

这适用于任何不可变的对象,而不仅仅是地图。 Immutable.is()方法由Set的方法在内部使用,以确定在对不可变对象进行操作时的相等性,这使得使用这些对象的集合比使用普通JavaScript对象的集合更容易。

因此,考虑到这一切,让我们看看一些不可变的Set操作实际工作的例子。

Subtract

…a string from a Set of strings

请记住,即使只有一个要减去的值,Set.subtract()中的参数也必须始终是一个数组。

// Subtract an string from a Set of strings
const avengersSet = Immutable.Set(['ironMan', 'captainAmerica', 'blackWidow']);// Output:
avengersSet.subtract(['blackWidow']);["ironMan", "captainAmerica"]

…an array of strings from a Set of strings

// Subtract an string from a Set of strings
const avengersSet = Immutable.Set(['ironMan', 'captainAmerica', 'blackWidow']);
avengersSet.subtract(['blackWidow', 'captainAmerica']);// Output:
["ironMan"]

…an object from a Set of objects

// Subtract an object from a Set of objects// Subtract blackWidow from avengersSet
const blackWidow = {blackWidow: 'Natasha Romanov'
};const avengersSet = Immutable.Set([{ironMan: 'Tony Stark'
}, {captainAmerica: 'Steve Rogers'
}, blackWidow]);// Output:
avengersSet.subtract([blackWidow]);[[object Object] {ironMan: "Tony Stark"
}, [object Object] {captainAmerica: "Steve Rogers"
}]

请注意,名为blackWidow的变量首先分配给对象{blackWidow:'Natasha Romanova'},然后添加为avengersSet的一部分。我们这样做是为了在subtract()方法中使用blackWowow来识别我们要减去的对象。

值得重复的是,您不能使用键/值对来标识要从对象集合中减去的对象:您必须先将对象分配给对象,然后在subtract()方法中使用该变量名称。

…an array of objects from a Set of objects

// Subtract an object from a Set of objects// Subtract blackWidow and captainAmerica from avengersSet
const blackWidow = {blackWidow: 'Natasha Romanov'
};const captainAmerica = {captainAmerica: 'Steve Rogers'
}const avengersSet = Immutable.Set([{ironMan: 'Tony Stark'
}, captainAmerica, blackWidow]);// Output:
avengersSet.subtract([blackWidow, captainAmerica]);[[object Object] {ironMan: "Tony Stark"
}]

…a Map from a Set of Maps

// Subtract a Map from a Set of Maps// First, create our Maps
const ironMan = Immutable.fromJS([{ironMan: 'Tony Stark'
}, {captainAmerica: 'Steve Rogers'
}, {blackWidow: 'Natasha Romanov'
}]);// Create a Set of Maps
const avengersSet = Immutable.Set(ironMan);// Now subtract blackWidow (sorry Natasha)
avengersSet.subtract([Immutable.fromJS({blackWidow: 'Natasha Romanov'
})]);// OUTPUT[[object Object] {ironMan: "Tony Stark"
}, [object Object] {captainAmerica: "Steve Rogers"
}]

…a List from a Set of Lists

// Subtract a List from a Set of Lists// First, create our Lists
const avengers = Immutable.fromJS([['ironMan', 'Tony Stark'], ['captainAmerica', 'Steve Rogers'],['blackWidow', 'Natasha Romanov']]);// Create a Set of Lists
const avengersSet = Immutable.Set(avengers);// Now subtract ironMan (so long, Tony)
const ironMan = Immutable.List(['ironMan', 'Tony Stark'])// Remember, subtract requires its arguments to be placed in an array
avengersSet.subtract([ironMan]);

…one Set from another

// Subtract a Set from another Set// First, create our Sets
const ironMan = Immutable.Set(['ironMan', 'Tony Stark']);const captainAmerica = Immutable.Set(['captainAmerica', 'Steve Rogers']);const blackWidow = Immutable.Set(['blackWidow', 'Natasha Romanov']);// Create a Set of Sets
const avengersSet = Immutable.Set([ironMan, captainAmerica, blackWidow]);// Now subtract captainAmerica (bye Steve)
avengersSet.subtract([Immutable.Set(['captainAmerica', 'Steve Rogers'])]);

Union

…two sets of strings

// Create a union of two Sets of strings
const avengersCast = Immutable.Set(['ironMan', 'captainAmerica', 'blackWidow']);
const civilWarCast = Immutable.Set(['ironMan', 'antMan', 'spiderMan']);// Output:
avengersCast.union(civilWarCast);

…a Set of strings and an array of strings

// Create a union of two Sets of strings
const avengersCast = Immutable.Set(['ironMan', 'captainAmerica', 'blackWidow']);// Output:
avengersCast.union(['ironMan', 'antMan', 'spiderMan']);

…a Set of objects and an object

// Add an object to a set of objects with union// Add blackWidow to avengersSet
const blackWidow = {blackWidow: 'Natasha Romanov'
};const avengersSet = Immutable.Set([{ironMan: 'Tony Stark'
}, {captainAmerica: 'Steve Rogers'
}, blackWidow]);// Output:
avengersSet.union([blackWidow]);

…a Set of Maps and a Map

// Add a Map to a Set of Maps// First, create our Maps
const ironMan = Immutable.fromJS([{ironMan: 'Tony Stark'
},{captainAmerica: 'Steve Rogers'
}]);// Create a Set of Maps
const avengersSet = Immutable.Set(ironMan);// Now add blackWidow (hello Natasha)
avengersSet.union([Immutable.Map({blackWidow: 'Natasha Romanov'
})]);

…a Set of Maps and an object

// Add a Map to a Set of Maps// First, create our Maps
const ironMan = Immutable.fromJS([{ironMan: 'Tony Stark'
},{captainAmerica: 'Steve Rogers'
}]);// Create a Set of Maps
const avengersSet = Immutable.Set(ironMan);// Now add blackWidow (hello Natasha)
avengersSet.union([{blackWidow: 'Natasha Romanov'
}]);

…a Set of Lists and a List

// Add a List to a Set of Lists// First, create our Lists
const ironMan = Immutable.List(['ironMan', 'Tony Stark']);const captainAmerica = Immutable.List(['captainAmerica', 'Steve Rogers']);const blackWidow = Immutable.List(['blackWidow', 'Natasha Romanov']);// Create a Set of Lists
const avengersSet = Immutable.Set([captainAmerica, blackWidow]);// Now add ironMan (Hi, Tony)
avengersSet.union([ironMan]);

…two Sets

// Add a Set to another Set// First, create our Sets
const ironMan = Immutable.Set(['ironMan', 'Tony Stark']);const captainAmerica = Immutable.Set(['captainAmerica', 'Steve Rogers']);const blackWidow = Immutable.Set(['blackWidow', 'Natasha Romanov']);// Create a union of two Sets
const avengersSet = Immutable.Set([ironMan, blackWidow]);// Now add captainAmerica
avengersSet.union([captainAmerica]);

Intersect

两个集合的交集是仅包含两个集合中存在的那些值的集合。如果一个值存在于集合A中,而不是集合B(反之亦然),那么它不包含在返回的相交集合中。

…two Sets of objects

// Intersect two Sets of objects// intersect avengersCast with civilWar cast
const blackWidow = {blackWidow: 'Natasha Romanov'
};const ironMan = {ironMan: 'Tony Stark'
};const captainAmerica = {captainAmerica: 'Steve Rogers'
};const theHulk = {theHulk: 'Bruce Banner'
};const antMan = {antMan: 'Scott Lang'
};const spiderMan = {spiderMan: 'Peter Parker'
};const avengersCast = Immutable.Set([ironMan, captainAmerica, blackWidow, theHulk]);
const civilWarCast = Immutable.Set([ironMan, captainAmerica, blackWidow, antMan, spiderMan]);// Output: who was in Avengers and Civil War?
avengersCast.intersect(civilWarCast);

…two Sets of arrays

// Intersect two Sets of arraysconst ironCapArray = ['ironMan', 'captainAmerica'];
const blackHulkArray = ['blackWidow', 'theHulk'];
const spiderAntArray = ['spiderMan', 'antMan'];const avengersCast = Immutable.Set([ironCapArray, blackHulkArray]);
const civilWarCast = Immutable.Set([ironCapArray, spiderAntArray]);// Output:
avengersCast.intersect(civilWarCast);

…two Sets of Maps

// Intersect two Sets of Maps// First, use fromJS() to create a List of Maps
const avengersCast = Immutable.fromJS([{blackWidow: 'Natasha Romanov'
}, {ironMan: 'Tony Stark'
}, {captainAmerica: 'Steve Rogers'
}, {theHulk: 'Bruce Banner'
}]);const civilWarCast = Immutable.fromJS([{blackWidow: 'Natasha Romanov'
}, {ironMan: 'Tony Stark'
}, {captainAmerica: 'Steve Rogers'
}, {antMan: 'Scott Lang'
}, {spiderMan: 'Peter Parker'
}]);// Now create two Sets of Maps
const avengersSet = Immutable.Set(avengersCast);
const civilWarSet = Immutable.Set(civilWarCast);// Output: who was in Avengers and Civil War?
avengersSet.intersect(civilWarCast);

…two Sets of Lists

// Intersect two Sets of arraysconst ironCapList = Immutable.List(['ironMan', 'captainAmerica']);
const blackHulkList = Immutable.List(['blackWidow', 'theHulk']);
const spiderAntList = Immutable.List(['spiderMan', 'antMan']);const avengersCast = Immutable.Set([ironCapList, blackHulkList]);
const civilWarCast = Immutable.Set([ironCapList, spiderAntList]);// Output:
avengersCast.intersect(civilWarCast);

…two Sets of Sets

// Intersect two Sets of arrays
​
const ironCapSet = Immutable.Set(['ironMan', 'captainAmerica']);
const blackHulkSet = Immutable.Set(['blackWidow', 'theHulk']);
const spiderAntSet = Immutable.Set(['spiderMan', 'antMan']);
​
const avengersCast = Immutable.Set([ironCapSet, blackHulkSet]);
const civilWarCast = Immutable.Set([ironCapSet, spiderAntSet]);
​
// Output:
avengersCast.intersect(civilWarCast);

转载于:https://www.cnblogs.com/hxling/articles/8099120.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DARPA举办AlphaDogfight决赛,AI 操控战斗机5:0战胜人类飞行员

来源:必达智库由美国国防部高级研究计划局(DARPA)举办的 “阿尔法狗决战试验”(AlphaDogfight)决赛当地时间8月20日于正式落下帷幕。最终,赫伦系统公司(Heron Systems)在虚拟空战中以…

A. PHP文件运行原理

转载于:https://www.cnblogs.com/youyuanjuyou/p/8099665.html

xshell 上下左右键乱码和退格键失效

我刚装的Linux环境是Ubuntu20.04,使用的xshell连接。 使用vi编辑文件时方向键会出现ABCD这些乱码,我觉得是因为vi不全导致的,安装vim之后问题解决,不需要像其他文章里说的那样,在属性里设置终端类型和键盘序列。 sudo…

智源研究院首席科学家刘嘉:认知神经的未来发展规划是什么?

来源 | AI前线演讲嘉宾 | 刘嘉编辑 | 冬梅8 月 24 日,北京智源人工智能研究院在京举办了人工智能的认知神经基础发布会。会上,智源研究院发布了重大研究方向——“人工智能的认知神经基础”,以跨学科交叉方式进一步夯实人工智能的科学基础。…

QT的mouseMoveEvent事件失效

void TalkWindow::enterEvent(QEvent *event){ grabMouse();}void TalkWindow::leaveEvent(QResizeEvent *event){ releaseMouse();} 在窗体里写这个鼠标事件就可以了,自己的业务还是在mouseMoveEvent的事件里去处理,网上有其他说什么QMAINwiNDOW的 cent…

ubuntu20.04安装Qt5.15.2并配置环境

qt官方取消了离线安装的方式,所以推荐在线安装,当然,如果想要自己通过源码编译也可以,参考官方文档:https://wiki.qt.io/Building_Qt_5_from_Git。 在线安装: 1.到官方网站下载:wget https://do…

最全数学各个分支简介

来源:算法数学俱乐部编辑 ∑Gemini数论人类从学会计数开始就一直和自然数打交道了,后来由于实践的需要,数的概念进一步扩充,自然数被叫做正整数,而把它们的相反数叫做负整数,介于正整数和负整数中间的中性数…

Centos 6.5部署nginx+uwsgi+django

Centos 6.5部署nginxuwsgidjango 一、安装python3,系统默认是python2.6 1、安装依赖软件yum -y install sqlite-develyum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel2、下载安装python3.6wget https://www.python.org/ftp/python/3.6.1/…

maven 引入外部jar包的几种方式

方式1&#xff1a;dependency 本地jar包 <dependency><groupId>com.hope.cloud</groupId> <!--自定义--> <artifactId>cloud</artifactId> <!--自定义--> <version>1.0</version> <!--自定义--> <scope>sys…

三大运营商集体为电费发愁,宣布“智能化关闭5G基站”,5G建设能省则省!

来源&#xff1a;卫星与网络何为“智能化关闭5G基站”本月初有消息称&#xff0c;中国联通洛阳分公司分别对已经入网的3种不同基站射频单元设备&#xff08;AAU&#xff09;&#xff0c;分不同时段定时开启空载状态下的深度休眠功能&#xff0c;从而实现智能化基站设备能耗管控…

mac brew install nginx遇到的坑

默认使用 brew install nginx 出现了一下的错误&#xff1a; localhost:testdj newstart$ brew install nginx > Installing dependencies for nginx: openssl, pare > Installing nginx dependency: openssl > Downloading https://homebrew.bintray.com/bottles/ope…

脑电传感器并不复杂,那精度呢?

来源&#xff1a;网络脑电传感器并不复杂&#xff0c;只是精度很难保证。本质上就是一个金属电极加上一个放大器&#xff08;前置保护&#xff09;&#xff0c;主要是防止传输过程中电压发生改变。一、介绍脑电波&#xff08;EEG&#xff09;检测其实和在医院常见的心电图&…

前端智能化的加速时刻:华为机器视觉的创新方程式

来源&#xff1a;脑极体守林员小陈每天的工作&#xff0c;大部分时间都用来在林间巡逻&#xff0c;以便第一时间发现安全隐患。枯燥繁重的工作让年轻的他有点郁闷。有天他举着朋友圈里转发的文章问领导&#xff0c;听说有地方都能用AI来识别山火了&#xff0c;咱们啥时候能用上…

Vue-Router + Vuex 实现单页面应用

效果查看(一个食品安全网,大家也可以发布一些食品安全的见闻,尽举手之劳): 源代码:https://pan.baidu.com/s/1i43H3LV 如果想要服务器端代码可以在评论里说明一下 利用vue路由和vuex实现了一个单页面应用&#xff0c;项目结构如下: 入口&#xff1a;main.js import ./global.cs…

改变宇宙之前,GPT-3最先改变的可能是OpenAI

大数据文摘出品来源&#xff1a;bdtechtalks编译&#xff1a;HippoGPT-3是人工智能研究实验室OpenAI的最新成果。它是有史以来规模最大的语言模型&#xff0c;引发了一系列关于人工智能将如何快速改变众多行业的讨论。但是&#xff0c;很少有人去讨论GPT-3是如何改变OpenAI本身…

Java王者火柴人

前言 基于Java的飞翔小鸟游戏&#xff0c;本代码来自b站up主分享。本游戏所需的图片素材需要自己获取并下载&#xff0c;在此视频下&#xff0c;视频链接&#xff1a;【Java经典小游戏项目之飞翔的小鸟】 https://www.bilibili.com/video/BV1ou411o7br/?p10&share_source…

Windows 快捷键

win快捷键&#xff1a; 单独按Windows&#xff1a;显示或隐藏 “开始”功能表 WindowsBREAK&#xff1a;显示“系统属性” 对话框 WindowsD&#xff1a;显示桌面或恢复桌面 WindowsM&#xff1a;最小化所有窗口 WindowsShiftM&#xff1a;还原最小化的窗口 CtrlShiftN&am…

day2-元组 列表-赋值和深浅拷贝

一 元组 元组其实跟列表差不多&#xff0c;也是存一组数&#xff0c;只不是它一旦创建&#xff0c;便不能再修改&#xff0c;所以又叫只读列表 用途&#xff1a;一般情况下用于自己写的程序能存下数据&#xff0c;但是又希望这些数据不会被改变&#xff0c;比如&#xff1a;数据…

乖乖给行人让路?学界推出无人机控制技术NMPC,可在低空中实现自主导航和避障...

来源&#xff1a;万物智能视界前天&#xff0c;在深圳经济特区40周年庆上&#xff0c;上千架无人机在深圳上空演绎了一场大型灯光秀。近些年&#xff0c;各种无人机高空秀屡见不鲜&#xff0c;在刚刚过去的七夕夜上&#xff0c;上海警方也运用无人机开启了一场反欺诈安防宣传。…

个人银行管理系统

// 4-10个人银行账户管理系统.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 #include <iostream> #include <cmath> using namespace std; class SavingsAccount {//存储账户类 private:int id; //账号double balance; //余额…