数据结构与算法之数组结构

JS 的数组就是API的调用

一.其他语言的数组的封装(比如Java的ArrayList)

  • 为什么js的数组不需要封装,而java的需要封装呢? :因为java中的数组结构相对来说比较底层,而js当中对数组的操作封装的很好
    • 常见的语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的时Object类型
    • 常见语言的数组容量不会自动改变(需要进行扩容操作)
    • 常见的语言的数组进行中间插入删除操作性能比较低
  • 当其他语言进行中间插入的时候,后面的数据必须先全部一个一个全部往后移动一个位置,空出一个位置后,才能插入数据
  • 当其他语言进行删除的时候,还必须把后面的元素全部往前移动一个位置,因为删除了第一个元素,第一个是空的,通过索引0是取不到数据的,而后面的元素又不会动态的补上
  • 所以我们为什么还要使用数组呢?
    • 通过下标值取数据的时候,效率非常高,能够直接定位的那个数据,进行修改,和查询

二. 数组API的常见操作

定义一个数组 let numbers =[1,2,3,4,5,6]

添加元素

//在数组的最后一个位置添加元素
numbers.push(11)  //1,2,3,4,5,6,11

//在数组的头部位置添加一个元素
for (var i = numbers.length; i > 0; i--) {
    numbers[i] = numbers[i-1]
}
numbers[0] = -1
alert(numbers) // -1,1,2,3,4,5,6  (取到最后一个元素的后面一个位置,从后开始,将前面的一个赋值给后面一个,最后就空出头部位置了)

删除元素

// 删除最后的元素
numbers.pop()  //1,2,3,4,5
//删除头部的元素
numbers.shift() //2,3,4,5,6

任意位置的删除和修改

//删除 指定位置的几个元素  (几个元素,不是第几个)
numbers.splice(1, 2) //1,4,5,6

//修改 指定位置的几个元素
numbers.splice(1, 2, "a", "b") //1,a,b,4,5,6  
这种操作会先删除,在添加写入的元素:先从索引1开始删除两个,在从删除的地方加上a,b两个元素
eg:
numbers.splice(1, 2, "a")  //1,a,4,5,6
numbers.splice(1, 3, "a") //1,a,5,6

常见的其他数组方法

concats 连接两个或者更多数组,并返回结果
every 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回true, 否则返回false
filter 对数组中的每一项运行给定函数,返回该函数会返回 true的项组成的数组
forEach 对数组中的每一项运行给定函数。这个方法没有返回值
join 将所有的数组元素连接成一个字符串
indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
map 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
reverse 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
some 对数组中的每一项运行给定函数,如果任一项返回 true,则结果为true, 并且迭代结束
sort 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
toString 将数组作为字符串返回
valueOf 和 toString类似,将数组作为字符串返回

数组的合并

// 数组的合并
var nums1 = [1, 2, 3]
var nums2 = [100, 200, 300]
var newNums = nums1.concat(nums2)
alert(newNums) // 1,2,3,100,200,300

迭代方法

every()方法
  • every()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false.
  • 如果函数中每一个元素都返回true, 那么结果为true, 有一个为false, 那么结果为false
  • every()练习 :
    • 判断一组元素中是否 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]

// 判断数组的元素是否都包含a字符
var flag = names.every(function (t) {
    return t.indexOf('a') != -1 //indexof方法等于-1为没找到,找到了返回第一个索引
})
alert(flag)  //false
some()方法
  • some()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false
  • 但是和every不同的是, 一旦有一次函数返回了true, 那么迭代就会结束. 并且结果为true
  • some()练习 :
    • 判断一组元素中是否 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]

// 判断数组中是否包含有a字符的字符
var flag = names.some(function (t) {
    alert(t)
    return t.indexOf("a") != -1
})
alert(flag)
forEach()方法
  • forEach()方法仅仅是一种快速迭代数组的方式而已
  • 该方法不需要返回值
  • forEach的练习
// 定义数组
var names = ["abc", "cb", "mba", "dna"]

// forEach的使用
names.forEach(function (t) {
    alert(t)
})  //弹出四次框 ,分别对应数组的每一项

另外三个filter,map,reduce方法在关于js的随笔中有所阐述

原文地址:https://www.cnblogs.com/JCDXH/p/11905948.html