JavaScript数据结构基础学习
数组&集合
数组,高度灵活的数据结构,保存数据一般使用数组,如果强调排序和元素重复,必须使用数组
集合,仅在顺序无关紧要且要求值的唯一性时可用,与数组相比,可以简化数据访问(比如查找,删除)
数组
特点
- 保留插入顺序
- 通过索引访问元素,下标从0开始
- 可遍历(for循环)
- 大小(长度)可以动态调整
- 允许重复元素
- 删除和查找元素比较耗费性能
数组查找元素
find 查找到符合条件的项 返回true or false
findIndex 查找符合条件的项,返回下标,没找到返回-1
集合
const set = new set()
set.add(‘a’) // 在set对象尾部添加一个元素,返回该set对象
set.has(‘a’) // set中是否存在’a’ ,返回true or false
set.delete(value) // 删除指定元素,返回true or false
set.foreach(callback[,thisArg]) //按照插入顺序,为set对象中的每一个值调用一次callback,回调中的this可以指定thisArg
set.clear() // 清除set对象内所有元素,没有返回值
set.entries() // 返回一个新的迭代器对象,包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。每个值的键和值相等。
set.keys() // 返回一个新的迭代器对象,包含set对象中按插入顺序排列的所有元素的值
set.values() // 返回一个新的迭代器对象,包含set对象中按插入顺序排列的所有元素的值
const set = new Set()
set.add('header')
set.add('container')
set.add('footer')
const setIter = set.entries()
setIter.next().value = > ['header','header']
setIter.next().done => false
setIter.next().value => ['container','container']
setIter.next().done => false
setIter.next().value => ['footer','footer']
setIter.next().done = > false
set.next().value => undefined
set.next().done => true
特点
- 集合是无序的(存储和读取的顺序可能不一样),不能通过索引值访问想要的值
- 通过方法访问和获取元素
- 可遍历(for in , for of , forEach)
- 大小(长度)可动态调整长度
- 值的唯一性,不允许重复。重复add 也不会新增集合元素
- 删除和查找元素简单快捷,可以通过方法快速查找和删除元素不需要遍历
- 可以添加任意类型的数据项
对象&映射
对象,非常通用的构造和数据存储结构,如果添加额外的功能则必须使用,函数里可以获取当前对象的的值(this.xxx)
映射,专注于数据存储,与对象相比,可以简化数据访问
对象
- 无序的键值对数据
- 通过键(属性)访问元素
- 不可遍历(除了for-in循环)
- 键是唯一的,值不是
- 键必须是字符串,数字或符号
- 可以存储数据和“函数”(作为方法)
映射
- 有序的键值对数据
- 通过键访问元素
- 可遍历(使用for循环)
- 键是唯一的,值不是
- 键可以是各种类型的值(包括对象、数组)
- 纯数据存储,针对数据访问进行了优化
let map = new Map()
map.set(‘name’,‘summer’)
map.set(true,true)
map.get(‘name’) => ‘summer’
map.entries() => 返回一个新的Map包含 [key, value] 迭代器对象
map.keys() => 按插入顺序返回所有的键名组成的迭代器
map.values() 方法返回一个新的按顺序插入map对象中每个元素的value值组成的迭代器对象
map.forEach(callback[,thisArg]) thisArg 可选,执行callback时其this的值
map.size 属性值返回Map对象的元素数量
var myMap = new Map();
myMap.set('0', 'foo');
myMap.set(1, 'bar');
myMap.set({}, 'baz');
//keys()
var mapKeyIter = myMap.keys();
mapKeyIter.next().value. => "0"
mapKeyIter.next().value = > 1
mapKeyIter.next().value => {}
//entries()
var mapIter = myMap.entries();
console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]
// values()
var mapValIter = myMap.values()
mapValIter.next().value => 'foo'