JS算法系统学习第二章:数组结构

69 阅读4分钟

上一章:数据结构与算法的关系和定义

什么是数组?

字面理解:数字的组合

数组是一个 数据的集合,就是将一些数据放在一个盒子里,按照顺序排好,是存储一些数据的集合。

let arr = [1,2,3,4,"hi",true,false]

能保存同种类型的数据,也能保存不同类型的数据。通常保存同种类型的数据。

创建一个数组

通过 new Array() 创建或直接用字面量赋值

方式一:

let arr = new Array(1,2,3);
let arr = new Array();
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

方式二:

let arr = [1,2,3];

访问数组:数组的索引(下标)

[0] 是数组的第一个元素, [1] 是数组的第二个元素

let arr = [1,2,3];
console.log(arr[0], arr[1], arr[2]); // 1, 2, 3

数组的长度 length

let arr = [1,2,3];
console.log(arr.length); // 3

遍历数组:

let arr = [1,2,3];

for(let i=0;i<arr.length;i++){
    console.log(i, arr[i])
}

数组的常用方法

  1. 数组的增删改查:pushpopshiftunshiftsplice
let arr = [1,2,3];
arr.push(4); // 向数组的末尾添加一个或更多元素,并返回新的长度。
arr.pop(); // 删除数组的最后一个元素并返回删除的元素。
arr.shift(); // 删除并返回数组的第一个元素。
arr.unshift(10); // 向数组的开头添加一个或更多元素,并返回新的长度。
arr.splice(0,2,1); // 从数组中添加或删除元素。arr.splice(index,howmany,item1,.....,itemX) 

image.png

  1. 数组的排序: sort
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b}); // 1,5,10,25,40,100
points.sort(function(a,b){return b-a}); // 100,40,25,10,5,1
let arr = [
  {
    name:"demo0",
    age: 100
  },{
    name:"demo1",
    age: 50
  },{
    name:"demo2",
    age: 30
  },{
    name:"demo3",
    age: 90
  },
]
arr.sort((x,y)=> y.age - x.age)
  1. 数组的合并: concat
let a = [1,2,3]; 
let b = [4,5,6]; 
let c = a.concat(b); // [1,2,3,4,5,6]
let d = a.concat(b,7,8,9); // [1,2,3,4,5,6,7,8,9]
  1. 数组的迭代方法: everysomefiltermapforeachreduce

every:检测数组所有元素是否都符合指定条件

let ages = [32331640];  

const isAdult = ages.every(age => {
     return age >= 18; 
})

console.log(isAdult); // false

some:检测数组中的元素是否满足指定条件,有一个元素满足条件就返回 true

let ages = [3101820];  

const hasAdult = ages.every(age => {
     return age >= 18; 
})

console.log(hasAdult); // true

filter:检测数值元素,并返回符合条件所有元素的数组

let ages = [32331640];  

const adults = ages.filter(age => {
     return age >= 18; 
})

console.log(adults); // [32,33,40]

map:通过指定函数处理数组的每个元素,并返回处理后的数组

array.map(function(currentValue,index,arr), thisValue)
let numbers = [491625];  

const addNumbers = numbers.map(number => {
     return number+1; 
})

console.log(addNumbers); // [5, 10, 17, 26]
console.log(numbers.map(Math.sqrt)); // 2,3,4,5

foreach:数组每个元素都执行一次回调函数。

array.forEach(callbackFn(currentValue, index, arr), thisValue)
let arr = [491625];  

arr.forEach((item,index)=>{
    console.log(item,index);
})

reduce:将数组元素计算为一个值(从左到右)。通常可以用来累加、累乘、深度属性.的访问

let arr = [10,11,12,13];
let res = arr.reduce((item1, item2)=> item1+item2);
console.log(res); // 46
  1. 数组的迭代器接口

Symbol.iterator 迭代器接口 image.png

let arr = [1,2,3]
let item = arr[Symbol.iterator]()
console.log(item); // 获取到迭代器对象
console.log(item.next());
console.log(item.next());
console.log(item.next());
console.log(item.next());

image.png

只要符合迭代器的接口,就可以使用 for of 循环,对迭代器对象进行遍历。

let arr = [1,2,3];
for(let i of arr){
   console.log(i)
}

image.png

  1. 返回值为迭代器的数组方法:entrieskeysvalues

entries:返回数组的可迭代对象,遍历键值对。

for(let [key, value] of ['a', 'b'].entries()){ 
    console.log(key, value); 
} 
// 0 "a" 
// 1 "b" 

// 不使用 for... of 循环 
let entries = ['a', 'b'].entries(); 
console.log(entries.next().value); // [0, "a"] 
console.log(entries.next().value); // [1, "b"] 

// 数组含空位 
console.log([...[,'a'].entries()]); // [[0, undefined], [1, "a"]]
let arr = [1,2,3];
for(let i of arr.entries()){
  console.log(i);
}

image.png

keys:遍历键名。

let arr = [1,2,3];
for(let i of arr.keys()){
  console.log(i);
}

image.png

values:遍历键值。

let arr = [1,2,3];
for(let i of arr.values()){
  console.log(i);
}

image.png

  1. Array.from:通过给定的对象中创建一个数组。也就是将类似于数组的结构转变为真的数组结构。
Array.from(object, mapFunction, thisValue)
function test(){
  console.log(Array.from(arguments))
}
test(1,2,3)

image.png

  1. 搜索:indexOflastIndexOffindfindIndexfindLastfindLastIndexincludes
let arr = [10,11,12,13];
console.log(arr.indexOf(10));  // 包含 返回对应索引 0
console.log(arr.indexOf(15));  // 不包含 -1 ,包含 索引
console.log(arr.inclues(15));  // 不包含 false ,包含 true

let res = arr.find(item=>item>10); // 返回符合传入测试(函数)条件的数组元素。(返回第一个满足的) 11
let res = arr.findIndex(item=>item>10); // 找索引值 1
let res = arr.findLast(item=>item>10); // 从后面开始查找 13
let res = arr.findLastIndex(item=>item>10); // 从后找索引值 3
console.log(res)
  1. 二维数组
let arr = [
  [98,99,100],
  [100,20,100],
  [80,99,80],
]

for(let i=0;i<arr.length;i++){
  console.log(`第${i+1}个人的成绩`)

  for(let j=0;j<arr[i].length;j++){
    console.log(arr[i][j])
  }
}

下一章:# JS算法系统学习第三章:栈结构