JavaScript 3.7 Map 、Set

C++ STL容器set,map性能测试 测试环境: CPU:Core i7-3770 3.4GHz 内存:4G 系统:64位 Windows 8.1 IDE:Visual Studio 2013 测试对象: set,hash_set,unordered_set map,hash_map,unordered_map 测试代码: #include #include #include #include # 阅读详情

一、Map

Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

Map与Object区别:

Map默认情况不包含任何键。只包含显式插入的键。

Map的键可以是任意值,包括函数、对象或任意基本类型。NaN也可以作为键

Map中的key是有序的。因此,当迭代的时候,一个Map对象以插入的顺序返回键值。

Map的键值对个数可以轻易地通过Size属性获取

Map是 iterable的,所以可以直接被迭代。

Map在频繁增删键值对的场景下表现更好。

一个Object有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

一个Object的键必须是一个String或是Symbol。

Object 的键值对个数只能手动计算

1、示例
let myMap = new Map();
 
let keyObj = {};
let keyFunc = function() {};
let keyString = 'a string';
 
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
 
myMap.size; // 3
 
// 读取值
myMap.get(keyString);    // "和键'a string'关联的值"
myMap.get(keyObj);       // "和键keyObj关联的值"
myMap.get(keyFunc);      // "和键keyFunc关联的值"
 
myMap.get('a string');   
outpit:
"和键'a string'关联的值"
因为keyString === 'a string'

myMap.get({});           
output:
undefined, 因为keyObj !== {}

myMap.get(function() {});
output:
undefined, 因为keyFunc !== function () {}


2、常用方法

myMap.clear()
移除Map对象的所有键/值对 。

myMap.delete(key)
如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。
随后调用 myMap.has(key) 将返回 false 。

myMap.entries()
返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

myMap.forEach(callbackFn[, thisArg])
按插入顺序,为 Map对象里的每一键值对调用一次callbackFn函数。
如果为forEach提供了thisArg,它将在每次回调中作为this值。

myMap.get(key)
返回键对应的值,如果不存在,则返回undefined。

myMap.has(key)
返回一个布尔值,表示Map实例是否包含键对应的值。

myMap.keys()
返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。

myMap.set(key, value)
设置Map对象中键的值。返回该Map对象。

myMap.values()
返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。

myMap[@@iterator]()
返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

示例
forEach方法按照插入顺序依次对 Map 中每个键/值对执行一次给定的函数
myMap.forEach(callback(value,key,map), thisArg)
thisAgr可以通过传参,改变this指向,如下

let keyString = 'a string';
 
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
var z = new Map();
z.set(1,"test1");
myMap.forEach(function(value,key){
  	console.log(this.get(1));
       }
              ,z);//thisArg传参为z

output:
test1
test1
test1

3、Map和数组的关系
let kvArray = [["key1", "value1"], ["key2", "value2"]];
使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);

myMap.get("key1"); // 返回值为 "value1"

使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组

更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);

或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

4、复制和合并
let original = new Map([
  [1, 'one']
]);

let clone = new Map(original);
console.log(clone.get(1)); // one
console.log(original === clone); // false. 浅比较 不为同一个对象的引用

对象间的合并
let first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);

合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
展开运算符本质上是将Map对象转换成数组。
let merged = new Map([...first, ...second]);

console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

和数组的合并
let first = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let second = new Map([
  [1, 'uno'],
  [2, 'dos']
]);
 Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
let merged = new Map([...first, ...second, [1, 'eins']]);

console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three

二、Set

对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。et中的元素只会出现一次,即 Set 中的元素是唯一的。

1、常用方法

set的常用方法大部分是和map相似的
set添加元素是用add,mao则用set

let mySet = new Set();
mySet.add("1");
mySet.add(5);

for (let [key, value] of mySet.entries()) 
console.log(key);
为了使这个方法和Map对象保持相似, 每个值的键和值相等

2、基本集合操作
function isSuperset(set, subset) {
    for (let elem of subset) {
        if (!set.has(elem)) {
            return false;
        }
    }
    return true;
}

function union(setA, setB) {
    let _union = new Set(setA);
    for (let elem of setB) {
        _union.add(elem);
    }
    return _union;
}

function intersection(setA, setB) {
    let _intersection = new Set();
    for (let elem of setB) {
        if (setA.has(elem)) {
            _intersection.add(elem);
        }
    }
    return _intersection;
}

function symmetricDifference(setA, setB) {
    let _difference = new Set(setA);
    for (let elem of setB) {
        if (_difference.has(elem)) {
            _difference.delete(elem);
        } else {
            _difference.add(elem);
        }
    }
    return _difference;
}

function difference(setA, setB) {
    let _difference = new Set(setA);
    for (let elem of setB) {
        _difference.delete(elem);
    }
    return _difference;
}

//Examples
let setA = new Set([1, 2, 3, 4]),
    setB = new Set([2, 3]),
    setC = new Set([3, 4, 5, 6]);

isSuperset(setA, setB);          // => true
union(setA, setC);               // => Set [1, 2, 3, 4, 5, 6]
intersection(setA, setC);        // => Set [3, 4]
symmetricDifference(setA, setC); // => Set [1, 2, 5, 6]
difference(setA, setC);          // => Set [1, 2]

3、数组去重
const numbers = [2,3,4,4,2,3,3,4,4,5,5,6,6,7,5,32,3,4,5]
console.log([...new Set(numbers)]) 
// [2, 3, 4, 5, 6, 7, 32]

4、String转set
let text = 'India';
let mySet = new Set(text);  // Set {'I', 'n', 'd', 'i', 'a'}
mySet.size;  // 5
大小写敏感
new Set("Firefox")  // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ]
如果是小写firefox,第二个f将会被去重掉

Array参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

Set参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set

Map参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

JS宏进阶:Map与Object 相对于Object而言,他没有原型(也就是不能通过原型链的方式添加方法),但也存在自身的优势,某些场景,new Map 可能比 new Object 更好用。总的来说,new Map( ) 与 new Object( ) 都是JS中非常重要的对象,学会并理解他们的使用场景和优势,可以帮助你在开发中选择最合适的数据结构,提高代码的效率和可维护性。2.5、freeze:全方位冻结对象,也就是使对象变得不可扩展,标记所有现有属性为不可配置,并将所有现有属性冻结(即不可写)。对于普通对象,该方法通常返回对象本身。 阅读详情

相关推荐

javascript中的Map和Set

我们本篇介绍了JS中两种常见的数据结构,随着你开发的深入,这些知识点必然会用到,先把它储备好,在用的时候就有备选的方法。要不然只能靠笨办法去实现,效率和性能就不太高。

低代码布道师的博客 1696

JS的Map对象

相当于c#里面的dictionary 1,js创建map对象 var map = new Map(); 2.将键值对放入map对象 map.set(“key”,value) map.set(“key1”,value1) map.set(“key2”,value2) 3.根据key获取map值 map.get(key) 4.删除map指定对象 delete map[key] 或 map.delete(key) 5.循环遍历map map.forEach(key=>{   console.log(“key

wnk1997的博客 1万+

告别手动核对!用这个ABAP报表一键导出所有物料的库存与需求清单

本文介绍了如何通过定制化ABAP报表一键导出SAP系统中所有物料的库存与需求清单,整合MD04、MB52、ME2N等多个事务码的数据,大幅提升供应链管理和生产计划效率。该报表可自动生成包含库存状态、MRP需求、采购订单等关键指标的物料全景视图,帮助企业减少手工操作错误,节省时间成本。

weixin_33725515的博客 467

js的map方法

Map集合中的键和值可以是任何类型,并且如果使用集合中已存在的键将值添加到Map集合中,新值将替换旧值。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。返回一个新数组,数组中的元素为原始数组调用函数处理后的值,并且按照原始数组元素调用函数处理后的值。用来获取一个Map对象指定的元素,返回的是键所对应的值,如果不存在则会返回undefined。示例:数组中的每个元素乘以输入框指定的值,并返回新数组。...

m0_67393157的博客 2396

QMT实盘交易入门:5分钟搞定ETF全球配置策略(附完整代码)

本文详细介绍了如何使用QMT平台实现ETF全球配置策略,从环境准备到策略编写、实盘部署全流程仅需5分钟。通过xtquant库对接交易所接口,提供完整的动量轮动策略代码,帮助投资者快速掌握自动交易技术,优化全球资产配置。

weixin_30675247的博客 334

空地多无人平台协同路径规划复现:从建模到Matlab仿真全解析

路径规划是机器人领域的核心基础技术,从单机避障到多平台协同,问题复杂度显著提升。空地协同规划融合无人机与无人车的异构优势,通过将地图分层建模为空中与地面栅格,并采用A*算法生成初始路径、B样条平滑以及改进遗传算法进行任务分配与时间同步优化,能够有效处理几何约束、运动学约束和避碰约束等。该技术广泛应用于区域巡逻、目标搜索、物资转运等任务场景,也是高校论文复现和工程仿真的常见课题。本文从问题建模、算法设计到Matlab代码结构,系统梳理了一套空地多无人平台协同路径规划的复现思路,同时给出坐标系校准、遗传算法收敛

weixin_32175665的博客 248

一分钟掌握js中的map方法

这里写目录标题map是什么map方法的结构及入参语法糖map一般不改变原数组 map是什么 map是操作js数组的方法,也可以说是一个函数,作用是遍历整个数组,对里面的每个值做处理再返回一个对象,注意,除非使用map数组里面存在嵌套复杂的对象、数组结构,否则map是不会修改原数组的 map方法的结构及入参 map的入参需要传递一个函数进去,因为说它是可以遍历数组的,所以传入的这个函数调用的次数由数组的长度决定,长度是3就是3次,是4就是4次 //index可以不传 [1,2,3].map(function(

在下月亮有何贵干 2万+

AURIX™ TC49x芯片手册中文分享(二)

主要内容为第一章、功能模块的特征

xibaofenqi的博客 1561

wps jsa的map字典无法在本地窗口看到下级结构的解决方法

JSA群的同学免费领取 郑广学JSA火箭速成班。在vba里的字典就无法查看多级嵌套结构。这样再写字典的时候就不用颅脑调试了!花了2天时间 自己封装了超级字典类。同时可以显示每层的级别以及顺序编号。俗话说得好 自己动手 丰衣足食。可以在调试窗口查看多级结构。结果到了jsa里还是不能。

baidu_21259995的博客 468

[VisionPro] CogPMAlignTool 工具详解

[VisionPro] [CogPMAlignTool] [模板匹配]

weixin_43163656的博客 1万+

微信小程序 - 实现身份证OCR识别人像面与国徽面并提取字段信息,详解从手机相册选取或打开摄像头拍照上传身份证正反面图片ocr文字识别数据填充表单(提供免费纯前端ocr识别插件+百度OCR识别API)

微信小程序身份证识别,微信小程序身份证拍照、上传并OCR识别,微信小程序实现OCR扫描识别,微信小程序识别身份证免费插件,微信小程序实现身份证识别功能。ocr识别插件。微信身份证拍照后进行ocr识别,微信小程序OCR扫描识别身份证,OCR身份证实名认证+图片上传+拍照上传图片,微信小程序之身份证照片正反上传,小程序OCR身份证识别,微信小程序实现文字识别-ocr插件,微信小程序利用百度AI实现扫描身份证获取信息功能,基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例demo,将上传的照片传到服务

🏆 前端领域优质创作者 8133

Javascript 从ES5到ES7总结 - 3 array-set-map-2

array : var arr = [{id: 1, name: "one"}, {id: 2, name: "two" }] array.find(object => object.id === 2); // {id:2, name:"two"} -sorting  const arr = [ "sex", "age", "job"]; arr.sort(); //re

我的英文站点:https://iorilan.medium.com/ 620

【Android 教程系列第 30 篇】为什么要为 App 应用加固 ?如何为 App 应用加固 ?

一:为什么要为 App 应用加固 ? 二:如何为 App 应用加固 ? 三:加固后为什么要重新签名 ?

“Allen Su”的博客 7053

数组去重的几大方法

数组去重的几大方法 1、reduce var arr = [1,2,3,3,4,4,5,5,6]; var newArr = arr.reduce((prev,cur)=>{ if(!prev.includes(cur)){ return prev.concat(cur); }else{ return prev; } },[]); console.log(newArr); 2、set var arr = [1,2,3,3,4,4,5,5,6,'

weixin_44735018的博客 246

大疆A型板使用经验分享(二)——A型板原理图和引脚图

一.原理图 二.引脚图

weixin_43361652的博客 7680

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

前端八股文面经大全:京东前端实习一面(2026-04-16)·面经深度解析

前端面试深度解析与趋势观察 本文针对京东前端实习一面的25个问题进行了系统性的技术拆解,揭示了当前前端面试的三大核心趋势: 框架原理深度考察:Vue3与Vue2响应式原理对比(Proxy vs Object.defineProperty)、React的useState设计哲学等问题的出现,表明面试官更加注重对框架底层机制的理解。 工程化思维要求提升:高内聚低耦合、接口封装原则、状态管理选型等问题的设置,反映出企业越来越重视开发者的工程化实践能力。 全栈知识广度扩展:从JWT原理到浏览器存储方案选型(loca

weixin_50077637的博客 542

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JavaScript map对象/set对象详解

这个方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。方法在数组操作中非常有用,它允许你遍历数组的每个元素,并对每个元素执行一个函数,然后将该函数的结果组成一个新的数组。对象是一种特殊的类型,它允许你存储唯一的值(无论是原始值还是对象引用)。以下是一些基本的操作。有时,你可能需要对数组中的每个元素进行复杂的转换,这可能需要多个步骤或依赖于其他数据。是一个内建的对象类型,它允许你存储唯一的值,无论是原始值或者是对象引用。,其中的每个元素都是原数组中对应元素的两倍。

日常笔记/总结/系列知识梳理 6637

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

js 中 Map 和 Set 的用法及区别

目录1. Set1.1 简介1.2 常用语法1.3 用途1.4 遍历方法2. Map2.1 简介2.2 常用语法3. 区别 1. Set 1.1 简介 Set是ES6新增的数据结构,类似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。 Set是一个构造函数,用来生成set的数据结构。 set打印出来的数据结构,是一个对象 var set=new Set([1,2,3]) console.log(set) // Set(3) {1,2,3} 1.2 常

qq_45359288的博客 5339

set 有序吗js_js中Set和Map

js中除了有我们常见的五种数据结构,还有Set和Map两种数据类型。一.Set 无重复列表类型特点:1.没有下标,不是按照下标存储,但是是有序的,因此不能使用下标循环遍历2.没有重复元素,任何元素存在唯一性,因此可以用来作去重处理,存储不重复的数据,3.插入速度和删除速度非常快,遍历查找速度也非常快,但是略低于键值对类型。4.支持方法:add(添加) delete(删除) has(查找) fo...

weixin_31191387的博客 1569

js中的Set和Map

首先,我们先要知道Set和Map是个什么数据类型。控制台打印。顾名思义,是一个构造函数,所以我们就可以使用new关键字来创建出Set和Map对象。​ 一、Set Set构造函数能让你创建Set对象,其可以存储任意类型的唯一值,无论是基本类型或者对象引用。 const set1 = new Set([1, 2, 3, 4, 5]); //Set(5){1, 2, 3, 4, 5}​ 二、Map Map对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值 ​

^_^ 2273

js 数组 map set API

js中的数组,Map,Set的基本使用_xinxxxxxxxxx的博客-优快云博客js中的queue,map,set的基本使用queuelet queue = [];[1]queue.push({a:1}) [{a:1}]//splice 删除并返回队首值queue.shift()setlet set = new Set();//has 判断是否存在某个keymp.has(1);//get。

harvestUachieve的博客 824

javascript/js中Array、Set、Map数据结构特性及用法

本文温习前端开发中常见的3种数据结构:数组Array、有序集合Set、有序映射Map,并分别介绍其特性、用法示例。

qq_43521551的博客 1983

js中的map和set

map和set是 es6新增的数据类型: 网上有很多set和map分别对比数组的区别: https://www.cnblogs.com/7qin/p/9630964.html 主要看增删查改 js中的map和set https://es6.ruanyifeng.com/#docs/set-map https://blog.csdn.net/qq_38880700/article/details/84822932 set的作用: 可以用于数组去重,因为里面的值都是唯一的。...

南北极之间 4239

js Map和Set的区别

Set与Map的用法

weixin_45209120的博客 2431

JavaScript第 27 篇,JavaScript中的new map()和new set()使用详细(new map()和new set()的区别)

⭐在 JavaScript 中,Map 和 Set 是两种非常有用的数据结构,它们提供了强大的功能来管理和操作数据。这两种数据结构,在处理需要唯一性和高效查找的场景中,非常有用,可以帮助我们编写更简洁和高效的代码。

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 6676

【JS】Set 与 Map 的使用

(1)Set 对象类似于数组,成员的值都是唯一的,常用于数组去重等。Set 没有 value 只有key,value 就是 key,key 是不允许重复的。(2)Map 对象是键值对集合,和JSON对象类似,但是 key 不仅仅可以是字符串,还可以是其他类型的值。Map 中的键也是不允许重复。(3)Map 的键是不能修改的,但是键对应的值是可以修改的;Set 不能通过迭代器来改变 Set 的值,因为 Set 的值就是键。(4)Map 和 Set 数据结构是ES6语法,最大优点就是运行时间少大大。

Eliaukoyx 1627
上一篇: JavaScript 3.6 Symbol
下一篇: JavaScript 3.8 proxy和reflect
LetsStudy
博客等级 码龄9年 96粉丝 323原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值