JavaScript 数据结构与算法 之 数组

简介: JavaScript 数据结构与算法 之 数组

数组

创建及初始化

let daysOfWeek = new Array();
daysOfWeek = new Array(7);
daysOfWeek = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri','Sat');
daysOfWeek = [];
daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
  • 访问元素和迭代元素
for (let i = 0; i < daysOfWeek.length; i++) {
  console.log(daysOfWeek[i]);
}

添加元素

let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  • 在数组末尾插入元素
numbers[numbers.length] = 10;

// 使用push
numbers.push(11);
numbers.push(12, 13);
  • 在数组开头插入元素
// 在开头插入元素需要将所有后面元素往后移动一位
Array.prototype.insertFirstPosition = function(value) {
  for (let i = this.length; i > 0; i--) {
    this[i] = this[i - 1];
  }
  this[0] = value;
};
numbers.insertFirstPosition(-1);

// unshift
numbers.unshift(-2);
numbers.unshift(-4, -3); // 注意顺序

删除元素

  • 从末尾删除
numbers.pop();
  • 从数组开头删除
// 整理数组
Array.prototype.reIndex = function(myArray) {
  const newArray = [];
  for (let i = 0; i < myArray.length; i++) {
    if (myArray[i] !== undefined) {
      newArray.push(myArray[i]);
    }
  }
  return newArray;
}
// 手动移除第一个元素
Array.prototype.removeFirstPosition = function() {
  for (let i = 0; i < this.length; i++) {
    this[i] = this[i + 1];
  }
  return this.reIndex(this);
}
numbers = numbers.removeFirstPosition();

// 使用shift方法
numbers.shift();

在任意位置添加或删除元素

  • splice()
numbers.splice(5, 3); // 删除从数组索引5开始的3个元素

numbers.splice(5, 0, 2, 3, 4); // 从数组索引5开始删除0个元素,添加三个元素

二维和多维数组

let averageTemp = [];
averageTemp[0] = [72, 75, 79, 79, 81, 81];
averageTemp[1] = [81, 79, 75, 75, 73, 73];
  • 迭代二维数组元素
function printMatrix(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      console.log(arr[i][j]);
    }
  }
}
printMatrix(averageTemp);
  • 多维数组
const matrix3x3x3 = [];
for (let i = 0; i < 3; i++) {
  matrix3x3x3[i] = [];
  for (let j = 0; j < 3; j++) {
    matrix3x3x3[i][j] = [];
    for (let k = 0; k < 3; k++) {
      matrix3x3x3[i][j][k] = i + j + k;
    }
  }
}

// 输出
for (let i = 0; i < matrix3x3x3.length; i++) {
  for (let j = 0; j < matrix3x3x3[i].length; j++) {
    for (let k = 0; k < matrix3x3x3[i][j].length; k++) {
      console.log(matrix3x3x3[i][j][k]);
    }
  }
}

JS 数组方法参考

  • concat():连接 2 个或更多数组,并返回结果

    const zero = 0;
    const positiveNumbers = [1, 2, 3];
    const negativeNumbers = [-3, -2, -1];
    let numbers = negativeNumbers.concat(zero, positiveNumbers);
  • every():对数组中的每个元素运行给定函数,如果该函数对每个元素都返回 true,则返回 true
  • some():对数组中的每个元素运行给定函数,如果任一元素返回 true,则返回 true
  • forEach():对数组中的每个元素运行给定函数。这个方法没有返回值
  • map():对数组中的每个元素运行给定函数,返回每次函数调用的结果组成的数组
  • filter():对数组中的每个元素运行给定函数,返回该函数会返回 true 的元素组成的数组
  • reduce():对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值
  • join():将所有的数组元素连接成一个字符串
  • indexOf():返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
  • lastIndexOf():返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
  • slice():传入索引值,将数组里对应索引范围内的元素作为新数组返回
  • sort():按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
  • toString():将数组作为字符串返回
  • valueOf():和 toString 类似,将数组作为字符串返回
  • reverse():颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
  • ES6及数组新功能

    方法 描述
    @@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对
    copyWithin 复制数组中一系列元素到同一数组指定的起始位置
    entries 返回包含数组所有键值对的@@iterator
    includes 如果数组中存在某个元素则返回 true,否则返回 false
    find 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素
    findIndex 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素在数组中的索引
    fill 用静态值填充数组
    from 根据已有数组创建一个新数组
    keys 返回包含数组所有索引的@@iterator
    of 根据传入的参数创建一个新数组
    values 返回包含数组中所有值的@@iterator
    • 使用for...of循环迭代
    for (const n of numbers) {
      console.log(n % 2 === 0 ? 'even' : 'odd');
    }
    • 使用@@iterator对象
    let iterator = numbers[Symbol.iterator]();
    console.log(iterator.next().value); // 1
    console.log(iterator.next().value); // 2
    console.log(iterator.next().value); // 3
    console.log(iterator.next().value); // 4
    console.log(iterator.next().value); // 5
    
    // 或者使用for...of
    for (const n of iterator) {
      console.log(n);
    }
    • 数组的entries、keys和values方法
    let aEntries = numbers.entries(); // 得到键值对的迭代器
    console.log(aEntries.next().value); // [0, 1]
    console.log(aEntries.next().value); // [1, 2]
    console.log(aEntries.next().value); // [2, 3]
    
    const aKeys = numbers.keys();
    console.log(aKeys.next()); // { value: 0, done: false }
    console.log(aKeys.next()); // { value: 1, done: false }
    
    const aValues = numbers.values();
    console.log(aValues.next()); // { value: 1, done: false }
    console.log(aValues.next()); // { value: 2, done: false }
    • 使用from方法
    let numbers2 = Array.from(numbers);
    // 使用过滤函数
    let evens = Array.from(numbers, x => (x % 2 == 0));
    • 使用Array.of方法
    let numbers3 = Array.of(1);
    let numbers4 = Array.of(1, 2, 3);
    
    let numbersCopy = Array.of(...numbers4);
    • 使用fill方法
    let numbersCopy = Array.of(1, 2, 3, 4, 5, 6);
    numbersCopy.fill(0); // [0, 0, 0, 0, 0, 0]
    numbersCopy.fill(2, 1); // [0, 2, 2, 2, 2, 2]
    numbersCopy.fill(1, 3, 5); // [0, 2, 2, 1, 1, 2]
    
    let ones = Array(6).fill(1); // [1, 1, 1, 1, 1, 1]
    • 使用copyWithin方法
    let copyArray = [1, 2, 3, 4, 5, 6];
    copyArray.copyWithin(0, 3); // [4, 5, 6, 4, 5, 6]
    copyArray = [1, 2, 3, 4, 5, 6];
    copyArray.copyWithin(1, 3, 5); // [1, 4, 5, 4, 5, 6]
  • 排序元素
numbers.reverse(); // 反序

numbers.sort(); // 默认将元素看做字符串进行排序
numbers.sort((a, b) => a - b); // 自定义比较函数
  • 搜索
console.log(numbers.indexOf(10)); // 返回与参数匹配的第一个参数的索引
console.log(numbers.lastIndexOf(10)); // 返回与参数匹配的的最后一个元素的索引

类型数组

类型数组用于存储单一类型的数据。使用 WebGL API、进行位操作、处理文件和图像时,类型数组都可以大展拳脚。
let myArray = new TypedArray(length);
类型数组 数据类型
Int8Array 8位二进制补码整数
Uint8Array 8位无符号整数
Uint8ClampedArray 8位无符号整数
Int16Array 16位二进制补码整数
Uint16Array 16位无符号整数
Int32Array 32二进制补码整数
Uint32Array 32位无符号整数
Float32Array 32位IEEE浮点数
Float64Array 64位IEEE浮点数
相关文章
|
8天前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
|
17天前
|
JavaScript 前端开发
JavaScript基础知识-数组的遍历
关于JavaScript数组遍历基础知识的文章。
27 2
JavaScript基础知识-数组的遍历
|
2天前
|
JavaScript 前端开发
js删除数组最后一个元素
js删除数组最后一个元素
|
17天前
|
JavaScript 前端开发
JavaScript基础知识-数组的练习
关于JavaScript基础知识中数组操作的练习,主要介绍了如何从一个包含Person对象的数组中过滤出成年人(年龄达到18岁及以上)并将他们放入一个新的数组中。
25 1
JavaScript基础知识-数组的练习
|
17天前
|
JavaScript 前端开发
JavaScript基础知识-数组的常用方法
关于JavaScript基础知识-数组的常用方法。
15 1
JavaScript基础知识-数组的常用方法
|
17天前
|
JavaScript 前端开发 索引
JavaScript基础知识-数组基于索引访问
关于JavaScript数组基于索引访问的基础知识介绍。
13 1
JavaScript基础知识-数组基于索引访问
|
17天前
|
JavaScript 前端开发
JavaScript基础知识-数组的定义方式
本文介绍了JavaScript中数组的多种定义方式。
11 1
JavaScript基础知识-数组的定义方式
|
1天前
|
JavaScript 前端开发 索引
|
7天前
|
JavaScript
js 循环数组取值
js 循环数组取值
|
13天前
|
存储 JavaScript 前端开发
JS中的数组有哪些常用操作函数和属性
【9月更文挑战第7天】JS中的数组有哪些常用操作函数和属性
9 1