JS 数组

202 阅读3分钟

JS的数组并不是典型的数组,是用 key 和 value 模拟出的。

典型的数组:

  • 元素的数据类型相同。
  • 使用连续的内存存储。
  • 通过数字下标获取元素。

但JS的数组:

  • 元素的数据类型可以不同
  • 内存不一定是连续的(对象是随机存储的)
  • 不能通过数字下标,而是通过字符串下标,可以有任何 key。

一、创建数组

1、新建

let arr=[1,2,3]
let arr2=new Array(1,2,3)  //均创建数组 [1,2,3]

2、转化

let arr='1,2,3'.split(',')   //split分隔
let arr2='123'.split('')
Array.from('123')  //均创建数组 ["1","2","3"]

3、伪数组

伪数组就是像数组一样有 length 属性,也有 0、1、2、3 等属性的对象,看起来就像数组一样,但不是数组,例如

var fakeArray = {
  "0": "first",
  "1": "second",
  "2": "third",
  length: 3
}             // 此例为伪数组

伪数组的原型链中并没有数组的原型

4.合并 和 截取数组(concat 和 slice)

  • 合并两个数组,得到新数组——arr1.concat(arr2)
  • 截取一个数组的一部分(slice)
arr1.slice(1)  //从第二个元素截取,但原数组不改变
arr2.slice(0)   //复制、全部截取数组
//JS只提供浅拷贝

二、删元素

1、delete(不推荐)

let arr=['a','b','c']
delete arr['0']
// ——>[empty, "b", "c"]
// 数组的长度没改变,length 仍未3

delete删除元素不改变数组长度,删除后的数组——稀疏数组。

直接改length也可以删除元素,但是不推荐

2、arr.shift()

arr.shift() ——删除头部的元素,并返回被删元素(数组length也改变)。

3、arr.pop()

arr.pop()——删除尾部的元素,并返回被删元素(数组length也改变)。

4、arr.splice

  • arr.splice(index,1)——删除下标index的一个元素
  • arr.splice(index,1,'x')——删除下标index的一个元素,并在删除位置上添加'x'
  • arr.splice(index,1,'x','y')——删除下标index的一个元素,并在删除位置上添加'x' 'y' 下标index是从0开始计数的
例如:
let arr5='123'.split('') //arr5: ["1", "2", "3"]
arr5.splice(1,1)   // arr5: ["1", "3"]
arr5.splice(0,1,'x')  //arr5: ["x", "3"]
arr5.splice(1,1,'x','y')   //arr5: ["x", "x", "y"]

三、查看元素

1、查看所有元素

  • Object.keys(arr) —— 查看所有的属性名
  • Object.values(arr) —— 查看所有属性值

2、遍历数组

  • 采用 for 循环,例如
let arr8=[1,5,7,3,56]
for (let i=0;i<arr8.length;i++){
    console.log(`${i}:${arr8[i]}`)
}
  • 采用 forEach
arr8.forEach(function(x,y){
    console.log(`${y}:${x}`)  //x——array[i], y——i
})    //与采用上面for循环的例子结果一样

关于 forEach函数,

function forEach(array,fn){     
    for(let i=0;i<array.length;i++){
        fn(array[i],i,array)  //将array[i],i,array值赋给了fn参数
    }    //一般array数组本身用不到
}
for 和 forEach 的区别:
  • for 循环里可以用 break,continue等跳出循环,但是forEach不可以。
  • forEach 是函数, for 是关键字。

3、查看单个属性

  • (1)arr[index]——查看单个元素
  • (2)arr[arr.length] === undefinedarr[-1] ===undefined 属于索引越界。
  • (3)arr.indexOf(item)——查看某个元素是否在数组里,存在返回索引,否则返回 -1 。
  • (4)根据条件查找元素——arr.find(条件)。 例如 arr.find(item=>item%2===0)——找第一个偶数。
  • (5)根据条件查找元素的索引——arr.findIndex(条件)。例如arr2.findIndex(item=>item%2===0)——找第一个偶数的索引。

四、增加元素

1、加元素

  • (1)arr.push(item1,item2)—— 在尾部加元素,修改arr,返回新长度。
  • (2)arr.unshift(item1,item2)——在头部加元素,修改arr,返回新长度。
  • (3)arr.splice(index,0,item1,item2)——在中间加元素,0 指不删除元素。

2、修改顺序

  • (1)反转顺序——arr.reverse()。 如何反转 'abcdef' ?
let s='abcdef' 
s.split('').reverse().join('') //原数组没有改变,返回 "fedcba"
  • (2)自定义顺序: arr.sort((a,b)=> b-a) ——从大到小排;arr.sort((a,b)=>a-b)——从小到大排。 可用下列代码便于理解:
arr.sort(function(a,b){
    if (a>b){
    return -1 //较大数排在前面
}else if(a===b){
    return 0
}else{
    return 1
}})

五、数组变换

  • map —— n变n(一一映射)
  • filter —— n变少
  • reduce —— n变1 举例如下:
let arr=[1,2,3,4,5,6]
arr.map(item=>item*2)
//  [2, 4, 6, 8, 10, 12]
arr.filter(item=>item%2===0)
// [2, 4, 6]
arr.reduce((sum,item)=>{return sum+item},0) //0是sum的初始值
// 21
arr.reduce((result,item)=>{return result.concat(item*item)},[])
// [1, 4, 9, 16, 25, 36]