概述
数组
JS数组是一种特殊的对象。在JS中,没有真正的数组,通过对象键值对方式模拟的。
- 元素的数据类型可以不同。
- 内存不一定是连续的(对象是随机储存)。
不能通过数字下标获得,而是通过字符串下标获得。这意味着数组可以有任何 key。
伪数组
伪数组,就是像数组一样有
length属性,看起来就像数组一样,但不是数组。拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理)。
- 不具有数组所具有的方法。
数组与伪数组
- 伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法,方便处理数据;
- 数组是基于索引的实现,length会自动更新,而对象是键值对;
- 使用对象可以创建伪数组,伪数组可以正常使用数组的大部分方法;
- 伪数组原型是Object,而数组原型是Array,原型链再上一层才是 Object;
创建数组
Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。//直接画字面量let array = [1, 2, 3, 4, 5]//标准写法let array = new Array[1, 2, 3, 4, 5]//只规定了数组的 length,取不到键名let array = new Array[3]
分割split()
String.prototype.split()返回源字符串以分隔符出现位置分隔而成的一个 Arraylet arr = "123".split(",")//1,2,3let arr = "123".split("")//"1", "2", "3"
合并concat()
concat()方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。arr1.concat(arr2)[1, 2, 3].concat[4, 5, 6]
截取splice()
slice()方法返回一个新的数组对象,这一对象是一个由begin和end决定的原数组的浅拷贝(包括begin,不包括end)。原始数组不会被改变。 ```javascript //splice的第一个参数是删除的起始位置(从0开始),第二个参数是被删除的元素个数。 //如果后面还有更多的参数,则表示这些就是要被插入数组的新元素。 arr.splice(start, count, addElement1, addElement2, …);
//从原数组4号位置,删除了两个数组成员。 let a = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]; a.splice(4, 2) // [“e”, “f”]
//除了删除成员,还插入了两个新成员。 let a = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’]; a.splice(4, 2, 1, 2) // [“e”, “f”] a // [“a”, “b”, “c”, “d”, 1, 2]
//如果只是单纯地插入元素,splice方法的第二个参数可以设为0。 let a = [1, 1, 1]; a.splice(1, 0, 2) a // [1, 2, 1, 1]
//如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。 let a = [1, 2, 3, 4]; a.splice(2) // [3, 4] a // [1, 2]
<a name="wzX5V"></a>### 连接join()`**join()**` 方法将一个数组(或一个[类数组对象](https://developer.mozilla.org/zh-CN//docs/Web/JavaScript/Guide/Indexed_collections#Working_with_array-like_objects))的所有元素连接成一个字符串并返回这个字符串。<br />如果数组只有一个项目,那么将返回该项目而不使用分隔符。```javascriptlet text = ["123","456","789"]text.join()//"123,456,789"let text = ['123','456','789']text.join(" ")//"123456789"let text = ['123','456','789']text.join("-")//"123-456-789"
数组中的元素增删改查
增
增头unshift()
arr.unshift(newItem) //修改arr,返回值为arr的新长度arr.unshift(item1,item2)
增尾push()
arr.push(newItem) //修改arr,返回值为arr的新长度arr.push(item1,item2)
增中间splice()
arr.splice(index,0,"x") //在index出插入xarr.splice(index,0,"x","y")
删
删头shift()
//删除数组第一个元素,并返回被删除元素arr.shift()
删尾pop()
//删除数组最后一个元素,并返回被删除元素arr.pop()
删中间splice()
arr.splice(index,1) //删除index的第一个元素arr.splice(index,1,"x")//在删除位置添加"x"arr.splice(index,1,"x","y")//在删除位置添加"x" "y"
改
反转reverse()
arr.reverse()//反转这个元素的排序,并返回被反转的 arr
排序sort()
sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。
//按照自定义方式排序,可以传入一个函数作为参数[10111, 1101, 111].sort(function (a, b) {return a - b;})//(3) [111, 1101, 10111]
查
查看所有属性名与值
//查看所有 keyObject.keys(arr)//查看所有 valueObject.values(arr)//查看某个 key 在不在 arr 里面for(let key in arr){console.log(key)}
for 遍历数组
let arr = [1,2,3,4,5]for(let i = 0; i < arr.length; i++){console.log(`${i}:${arr[i]}`)}
forEach遍历
每一次调用函数fn,并将遍历数组的值作为参数返回给fn
function forEach(array,fn){for(let i=0;i<array.length;i++){fn(array[i],i,array)}
索引
arr.indexOf(item) //返回值如果是-1则表示没有当前值
find
arr.find(item => item%2===0) //查找第一个偶数arr.findIndex(item => item%2===0) //查找第一个偶数的索引
数组变换
map-映射
map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。
let arr = [1,2,3,4,5]let b = arr.map(item=>item*item) //[1,4,9,16,25]
filter-过滤
filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
let arr = [1,2,3,4,5]arr.filter(item =>item%2===0) //[2,4]
reduce-归纳
reduce方法依次处理数组的每个成员,最终累计为一个值。
let arr = [1,2,3,4,5]arr.reduce((sum,item)=>{return sum+item},0) //15
