javascript数据结构及其常用方法

目录

一、数组

1.创建数组

2.增删、排序元素

3.迭代方法

4.操作方法

5.位置方法

6.具体应用

二、字符串

1.长度/位置

2.检查包含

3.获取指定位置字符

4.截取/拼接

5.匹配(含正则)

6.格式化

三、Map

1.创建Map

2.Map方法、属性

3.迭代Map对象

四、Set

1.创建Set

2.Set方法

3.迭代Set对象


一、数组

1.创建数组

方法语法示例备注
数组字面量let arr = [value1, value2, ..., valueN]let numbers = [1, 2, 3, 4, 5]元素间以逗号分隔
Array构造函数let arr = new Array(value1, value2, ..., valueN)let arr = new Array('a', 'b', 'c')多个参数:数组初始元素
let arr = new Array(3)单个数值:数组长度(元素均为undefined)
Array.of()let arr = Array.of(value1, value2, ..., valueN)let arr = Array.of(5) // [5]始终创建包含所有传入参数的新数组
...操作符let arr = [...iterableObject]let newarr = [...arr,4,5,6]arr=[1,2,3]
Array.from() (ES6+)详见js数组、字符串、对象相互转换-CSDN博客let arr = Array.from('hello')于将类数组对象或可迭代对象转换为真正的数组
Array.prototype.fill() (ES6+)let arr = new Array(length).fill(value)let arr = new Array(5).fill('foo')用于创建一个指定长度并填充同一值的数组

创建二维数组:let arr = Array(m).fill().map(() => Array(n));

2.增删、排序元素

var arr = ['a','b','c','d']

以下方法均改变原数组

方法名功能返回值备注
push()添加一或多个元素到数组的末尾该数组新长度arr.push('x')
pop()删除数组中最后一个元素被删除元素arr.pop()数组为空时返回undefined
shift()删除数组中第一个元素被删除元素arr.shift()
unshift()添加一或多个元素到数组的头该数组新长度arr.unshift('x')
sort()默认按照Unicode排序(如字符串排序)排序后的数组升序:arr.sort((a,b)=>{return a-b})降序:arr.sort((a,b)=>{return b-a})
reverse()反向排列倒序后的数组arr.reverse()

3.迭代方法

1.forEach:对数组的每个元素执行一次给定的函数。

 arr.forEach((element) => console.log(element))

2.map:对原数组每一项进行操作后返回新数组。

 const formatArr = arr.map((e) => return(e.name))

3.find:返回数组中满足要求的第一个元素,否则返回 undefined。

 const found = arr.find(e => e.name==='dfb666')

4.filter:返回满足要求所有元素组成的新数组。

 const filterArr = arr.filter((e) => e > 6)

5.every

6.some

4.操作方法

1.join:用特定字符串连接所有元素,返回连接后的字符串(默认使用','分隔,如果使用"",则所有元素之间都没有任何字符)。

 const str = arr.join()//"a,b,c,d"
 const str = arr.join("")//"abcd"
 const str = arr.join("-")//"a-b-c-d"

2.slice(begin?,end?):原数组不变,返回新的浅拷贝的数组。

begin:提取起始处的索引,0开始,支持负数,大于数组长度时返回空数组。

end:提取终止处的索引,0开始,支持负数,slice提取原数组包含 begin但不包含 end,被省略或大于数组的长度会一直提取到原数组末尾。

 const sliceArr = arr.splice(5);//从第六个到最后一个(不要前五个元素)
 const sliceArr = arr.splice(-2);//从倒数第二个到最后一个(最后两个)
 const sliceArr = arr.splice(1,4);//索引为1,2,3的元素
 const sliceArr = arr.splice(-2,-1);//倒数第二个(不含倒数第一个)

3.splice(start,deleteCount?,item1?):原数组改变,返回被删除的元素数组。

start:修改的开始索引,超出数组长度末尾开始添加内容,负值表示倒数第几个开始,绝对值大于数组的长度表示开始位置为第0位。只有该参数时删除从start开始及之后的所有项

deleteCount:要移除的数组元素的个数, deleteCount大于start后的元素总数则删除含第start及之后的所有元素, 0或负数不移除元素。

item1:要添加进数组的元素,start位置后开始。如果不指定splice(start,deleteCount)将只删除

const arr = ['a', 'b', 'c', 'd']
arr.splice(1) //arr:['a'],返回被删除的元素['b', 'c', 'd']
arr.splice(1,2) //arr:['a', 'd'],返回被删除的元素['b', 'c']
arr.splice(1,2,'new','item') //arr:['a','new','item','d'],返回被删除的元素['b', 'c']

4.concat():原数组不变,返回新的连接后数组的副本。

 const newArr = arr.concat(9,[11,13]);//['a','b','c','d',9,11,13]

5.reduce():对数组中的每个元素执行一个提供的回调函数,并且将结果汇总为一个单一的输出值。

callback:一个回调函数,用于计算的每一步,它接收四个参数。(accumulator, currentValue, currentIndex, array)

  • accumulator:累计器,用来累计回调的返回值,是累计的结果。

  • currentValue:数组中正在处理的当前元素。

  • currentIndex(可选):数组中正在处理的当前元素的索引。

  • array (可选):调用 reduce 的数组。

initialValue (可选):作为第一次调用 callbackFn时第一个参数的值。如果没有提供 initialValue,则 reduce会从数组的第二个元素开始执行 callbackFn,且 accumulator 会被初始化为数组的第一个元素。

 const arr = [1,2,3,4]
 const sum = arr.reduce((accumulator, currentValue)=>{accumulator + currentValue}, 0);//10

5.位置方法

1.indexOf:查询某个元素在数组中第一次出现的位置。存在该元素返回下标,不存在返回-1

 const arr = ['a', 'b', 'c', 'c', 'b', 'a']
 var index = list.indexOf('c'); //2
 var index = list.indexOf('e'); //-1

2.lastIndexOf:查询某个元素在数组中做后一次出现的位置。存在该元素返回下标,不存在返回-1

 const arr = ['a', 'b', 'c', 'c', 'b', 'a']
 var index = list.indexOf('b'); //4
 var index = list.indexOf('e'); //-1

6.具体应用

1.数组去重

Array.from(new Set(arr))

2.数组查重

注意:该方法对NaN不适用

 var arr = ['a', 'b', 'c','b', 'a']
  for (var i = arr.length-1; i >= 0; i--) {
      if (ary.indexOf(ary[i]) != ary.lastIndexOf(ary[i])) {
          console.log("下标为:"+i +"数组中有重复元素:"+ary[i]);
      }
  }  

3.数组累加求和/积

 numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
 numbers.reduce((accumulator, currentValue) => accumulator * currentValue, 1);

4.找数组最大/小值

 numbers.reduce((accumulator, currentValue) => Math.max(accumulator, currentValue));
 numbers.reduce((accumulator, currentValue) => Math.min(accumulator, currentValue));

5.求平均值

 var AVG = ((eval(arr.join("+")) / arr.length) * 100) / 100; //平均值

6.比较两个数组元素相同

先转换成字符串再比较,缺点是不能区分数字和字符串

 [1,2,3].join('') === ['1', '2', '3'].join('') //true

二、字符串

1.长度/位置

const str = "Hello World"

1.length:获取字符串长度。

str.length //5

2.indexOf(searchVal,start):查找某个字符串,返回第一次匹配到的位置,否则返回-1。searchvalue必需,需要查找的字符串,start可选,开始查找的位置(含start)

 str.indexOf(searchvalue,fromindex)
 str.indexOf("llo", 4) //2
 str.indexOf("o", 5) //5
 str.indexOf("o", 8) //-1

3.lastIndexOf:查找某个字符,返回最后一次匹配到的位置,否则返回-1。

 str.lastIndexOf('llo') //2
 str.lastIndexOf("o") //7

2.检查包含

1.includes(searchVal,start):字符串是否包含指定的子字符串,返回 true或false。(不可检查正则表达式)

 str.includes("or", 2) //trur

2.startsWith(startVal,start):字符串是否以指定的子字符串开始,返回 true或false。start可选。

 str.startsWith("lo",3) //true

3.endsWith(endVal,length):当前字符串是否是以指定的子字符串结尾,返回 true或false。length可选,字符串的长度(0~length-1)

 str.endsWith("lo") //false
 str.endsWith("lo", 5) //true

3.获取指定位置字符

1.charAt(index):获取指定位置的字符。index的取值不在str的长度范围内时,str[index]返回undefined,charAt(index)会返回空字符串。

 str.charAt(1) 
 str[1] // 等价于

2.charCodeAt(index):指定位置字符的Unicode值。

str.charCodeAt(1) // e -> 101

4.截取/拼接

1.concat(string1, string2, ..., stringX):用于连接两个或多个字符串。该方法不会改变原有字符串,会返回连接两个或多个字符串的新字符串。

 "abc".concat("def", "ghij") //abcdefghij

2.slice(start, end):截取字符串,返回被提取部分的新字符串。[start,end)

start必须,要截取的片断的起始下标,第一个字符位置为 0,负数则从尾部开始截取。end可选,要截取的片段结尾的下标,未指定从start到结尾。

 str.slice(1,3) // el
 str.slice(-3,10) // lr

3.substr(start, length):start 必需,要截取的子串起始下标,支持负数。length可选,子串中的字符数,省略则截取到结尾。

 str.substr(1) //ello World

4.substring(from, to):用法同slice()。不同之处在于from>to时,截取[to,from)

str.substring(7,1) // ello W

5.split(separator,limit):separator必需,字符串或正则表达式,从该参数指定的地方分割 string。limit可选,指定返回的数组的最大长度。

 const list = "apples,bananas;cherries"; //正则分割
 const fruits = list.split(/[,;]/); //["apples", "bananas", "cherries"]

5.匹配(含正则)

函数含义返回值用例
match()方法在字符串 str 中找到匹配 regexp 的字符null或数组str.match(myReg)
matchAll()返回包含所有匹配正则表达式的结果及分组捕获组的迭代器见示例...str.matchAll(myReg)
search()返回第一个匹配项的位置index或-1str.search(myReg)
replace()不设置全局匹配g时,只替换第一个匹配成功的字符串片段。原串不变替换后的新串str.replace(myReg, newVal)
split()使用正则表达式(或子字符串)作为分隔符来分割字符串

6.格式化

1.大小写转换

方法含义用法
toLowerCase()返回转小写新串str.toLowerCase() //'hello world'
toUpperCase()大写str.toUpperCase() //'HELLO WORLD'
 const firstUpStr = str[0].toUpperCase() + str.substr(1)

2.去除空白符

方法含义用法
trim()移除字符串首尾空白符str.trim()
trimStart()移除开头空白符str.trimStart()
trimEnd()移除结尾空白符str.trimEnd()

三、Map

在JavaScript中,new Map() 用于创建一个新的Map对象。Map是一种数据结构,允许存储键值对,其中任何值(对象和原始值)都可以作为一个键或一个值。

特点:

  • 键值对存储:Map是一种键值对的集合,其中每个值都有一个相关联的键。

  • 键的唯一性:Map中的键是唯一的,不允许重复。新的值会覆盖与已存在键相关联的旧值。

  • 键的类型:Map的键可以是任何类型的值,包括基本数据类型、对象和函数。 顺序:Map能够记住键的原始插入顺序。

  • 迭代:Map是可迭代的,可以使用for…of循环或其他迭代方法遍历其键值对。

1.创建Map

 let myMap = new Map() //创建空 Map
 let myMap = new Map([  
   ['key1', 'value1'],  
   ['key2', 'value2'],  
   // ... 可以添加更多的键值对  
 ]);

2.Map方法、属性

set、get、has、delete、clear和size属性

 
//set(key, value): 向 Map 对象中添加一个键值对。如果键已经存在,则更新其对应的值。
 myMap.set('key3', 'value3');
 ​
 //get(key): 获取指定键对应的值。如果键不存在,则返回 undefined。
 let value = myMap.get('key1'); // value='value1'
 ​
 //has(key): 判断 Map 对象中是否存在指定的键。存在返回 true,否则返回 false。
 myMap.has('key2'); // true
 ​
 //delete(key): 删除指定键及其对应的值。成功删除返回 true,否则返回 false
 myMap.delete('key1'); // true
 ​
 // 清空Map对象中的所有键值对,myMap变为空Map
 myMap.clear(); 
 ​
 // 返回 Map 对象中键值对的数量
 let size = myMap.size; 

3.迭代Map对象

 // 迭代键  
 for (let key of myMap.keys()) {  
   console.log(key);  
 }  
 // 迭代值  
 for (let value of myMap.values()) {  
   console.log(value);  
 } 
 // 迭代键值对  
 for (let [key, value] of myMap.entries()) {  
   console.log(key, value);  
 }

四、Set

ES6新增Set集合类型,Set 在很多方面都像是加强的 Map。Set可以包含任何JS数据类型作为值

方法:

1.创建Set

Set会自动去重

注意Set([...])有[],直接给Set()传入数组会把数组里的元素放进去,而Set([arr,999])则有数组和另一元素

const mySet = new Set() //创建空Set
 let mySet = new Set(["abc", 1, true, {}, undefined, function fun(){}])

2.Set方法

add、has、delete、clear和size属性

 const s = new Set();
 ​
 //add(): 添加元素
 s.add(1).add(2).add(3);
 ​
 //has(): 查询Set实例是否存在某元素(返回布尔值)
 s.has(1); // true
 ​
 //delete(): 删除Set实例中某个元素(返回布尔值)
 s.delete(1) 
 ​
 //clear(): 清空Set实例
 s.clear()
 ​
 //size: 获取Set实例的元素个数
 s.size; // 3

3.迭代Set对象

 // 迭代键  
 for (let key of s.keys()) {  
   console.log(key);  
 }  
 // 迭代值  
 for (let value of s.values()) {  
   console.log(value);  
 } 
 // 迭代键值对  
 for (let [key, value] of s.entries()) {  
   console.log(key, value);  
 }
 ​
 const s = new Set();
 s.add(1).add(2).add(3);
 Array.from(s.keys()); // [1, 2, 3]
 Array.from(s.values()); // [1, 2, 3]
 Array.from(s.entries()); // [[1, 1], [2, 2], [3, 3]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值