通过增删改查对比Array,Map,Set,Object的使用成本和实现方式
1.Array 和 Map 对比
{ // array and map 增 查 改 删
let map = new Map();
let arr = [];
// 增
map.set('a', 1);
arr.push({'a': 1});
console.log('add', map, arr); // add Map(1) {"a" => 1} [{a: 1}]
// 查
let map_exist = map.has('a');
let arr_exist = arr.find(item => item.a);
console.log('exist', map_exist, arr_exist); // exist true {a: 1}
// 改
map.set('a', 2);
arr.forEach(item => item.a ? item.a = 2 : '');
console.log('mod', map, arr); // mod Map(1) {"a" => 2} [{a: 2}]
// 删除
map.delete('a');
let index = arr.findIndex(item=>item.a);
arr.splice(index, 1);
console.log('del', map, arr); // del Map(0) {} []
}
2.Set 和 Array 对比
{ // Set and array
let set = new Set();
let arr = [];
let o = {a: 1};
// 增
set.add(o);
arr.push(o);
console.info('add', set, arr); // add Set(1) {{a: 1}} [{a: 1}]
// 查
let set_exist = set.has(o);
let arr_exist = arr.find(item => item.a);
console.log('exist', set_exist, arr_exist); // exist true {a: 1}
// 改 Set存储对象的时候存储的是引用,所以修改时直接修改数据元素
set.forEach(item=>item.a? item.a =2:'');
arr.forEach(item => item.a ? item.a = 2 : '');
console.info('mod', set, arr); // mod Set(1) {{a: 2}} [{a: 2}]
// 删
set.forEach(item=>item.a? set.delete(item):'');
let index = arr.findIndex(item => item.a);
arr.splice(index, 1);
console.log('del', set, arr); // del Set(0) {} []
}
3. Map 和 Set 和 Object 对比
{ // map set object 注意对比使用成本和实现方式
let item = {a: 1};
let map = new Map();
let set = new Set();
let obj = {};
// 增
map.set('a', 1);
set.add(item);
obj['a'] = 1;
console.log('add', map, set, obj); // add Map(1) {"a" => 1} Set(1) {{a: 1}} {a: 1}
// 查
console.log({
map_exist: map.has('a'),
set_exist: set.has(item),
obj_exist: 'a' in obj
}); // {map_exist: true, set_exist: true, obj_exist: true}
// 改
map.set('a', 2);
item.a = 2; // set不参与,因为对象存储的是个引用,直接修改元素,没有存储数据元素item可使用forEach遍历修改
obj.a = 2;
console.log('mod', map, set, obj); // mod Map(1) {"a" => 2} Set(1) {{a: 2}} {a: 2}
// 删
map.delete('a');
set.delete(item);
delete obj.a;
console.log('del', map, set, obj); // del Map(0){} Set(0){} {}
}
4.总结(基于es6):
从语义上map最好,set需要依赖一个数据元素item语义上和map差不多,使用成本上map优先。
综上所述:在开发过程中涉及数据结构时能使用map不使用数组,考虑数据唯一性时使用set,放弃使用数组和object作为数据存储。
通过增删改查对比Array,Map,Set,Object的使用成本和实现方式的更多相关文章
- PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码
PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...
- bootstrap+Ajax+SSM(maven搭建)实现增删改查
https://www.jianshu.com/p/d76316b48e3e 源码: https://github.com/Ching-Lee/crud 功能点: 分页 数据校验 ajax Rest风 ...
- mybatis中的增删改查操作
在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...
- Django-ORM增删改查
ORM对单表进行增删改查 一,增加记录 #第一种方式 b=Book(name="Linux",price=66,author="kelvin",pub_date ...
- 元组,列表的增删改查, for,range 循环
1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 常用的功能: 1. 增: append() 2. 删 ...
- 1、list 的一些相关操作 2、增删改查 3、tuple 的操作 4、range
1. list(增删改查) 列表可以装大量的数据. 不限制数据类型. 表示方式:[] 方括号中的每一项用逗号隔开 列表和字符串一样.也有索引和切片 # lst = [1, "周杰伦" ...
- Android-SQLiteOpenHelper里增删改查
为什么要写一篇,Android-SQLiteOpenHelper里增删改查,的文章呢: 因为之前的方式是:MySQLiteOpenHelper(只负责 生成打开据库/生成打开表/升级表),在其他端:完 ...
- winform 窗体实现增删改查(CRUD)共用模式
转载:http://www.csframework.com/archive/2/arc-2-20110617-1632.htm 高度封装的编辑窗体 http://www.cnblogs.com/wuh ...
- python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)
一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...
随机推荐
- 用express实现CORS跨域(上-简单请求)
今天遇到了一个跨域请求登录验证的问题.所以有了尝试跨域的机会. 具体情景是,有一个登录界面写在名叫cas的站点上,但是相关的登录验证的后台接口是写在名叫earth的站点. 首先的反应是使用jsonp, ...
- Centos7搭建Mysql-5.6.38,及主从复制。
Server1:192.168.1.189 (主) Server2:192.168.1.190 (从) 1.关闭默认的firewalld防火墙,安装iptables. systemctl disa ...
- cudnn 卷积例子
运行环境:linux cuda cudnn cudnn API:https://docs.nvidia.com/deeplearning/sdk/cudnn-developer-guide/index ...
- Gym - 101196G :That's One Hanoi-ed Teacher (递推)
题意:给定当前汉诺塔的状态,问还有多少步走完,不合法输出“No”. 思路:显然可以一层一层试探下去的.我们设三个柱子为“起始”,“中转”,“终点”,当前状态的最大的盘子不可能在中转站处:如果在起始站, ...
- 找工作--volatile
在Java编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常访问的变量缓存起来,程序在读取这个变量时有可能会直接从缓存(例如寄存器)中来读取这个值,而不会从内存中读取.这样做的 ...
- 如何利用pyenv 和virtualenv 在单机上搭建多版本python 虚拟开发环境
pyenv 和virtualenv分别是干什么的? pyenv帮助你在一台机上建立多个版本的python环境, 并提供方便的切换方法. virtualenv则就是将一个目录建立为一个虚拟的python ...
- Centos6.5安装上传下载工具
执行下面命令即可. sudo yum install lrzsz rz 是上传命令 sz filename是下载命令 如果rz上传文件时提示 was skipped,则用sudo rz命令来进行上传.
- SSH不允许Root登陆的方法
不允许Root登陆的方法如下: vim /etc/ssh/sshd_config 把PermitRootLogin yes 改成: PermitRootLogin no 然后重启sshd服务: Ser ...
- VMware Player 与 Device/Credential Guard 不兼容
一.问题 当前:使用VMware Workstation 操作:安装docker 结果:电脑重启后,无法打开VMware Wokstation中的虚拟机 错误提示: 二.解决方案: 1. 控制面板-- ...
- 2.Apache + Tomcat + mod_jk实现集群服务
转自:http://www.cnblogs.com/dennisit/p/3370220.html Tomcat中的集群原理是通过组播的方式进行节点的查找并使用TCP连接进行会话的复制. 实现效果:用 ...