Javascript 数据结构学习笔记 (一)数组

285 阅读2分钟

JavaScipt 数据结构 (Ⅰ)数组

定义数组

  • 在js中定义数组较为简单:var name = [];

简单的斐波那契数列

  • 代码:
var fibonacci = []
fibonacci[1] = 1;
fibonacci[2] = 2;
//Access elements and iterate arrays
for (let i = 3; i < 10; i++){
    fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
}
for (let i = 1;i < fibonacci.length;i++){
    console.log(fibonacci[i]);
}
  • 可以看到:想要访问数组里特定的元素,可以用中括号传递数值位置。

数组的增删方法

增加元素

  • push() 用于在数组尾部添加元素
  • unshift() 用于在数组头部添加元素
  • splice(x,0,y1,y2,y3) 用于在x开始往后添加y1,y2,y3

删除元素

  • pop() 用于删除数组尾部的元素
  • shift() 用于删除数组头部的元素
  • splice(x,y) 用于删除从x开始往后的y个元素

二维及多维数组

代码:

 //以三维数组为例
var matrix3x3x3 = [];
for (var i=0;i<3;i++){
    matrix3x3x3[i] = [];
    for (var j=0;j<3;j++){
        matrix3x3x3[i][j] = [];
        for (var z=0;z<3;z++){
            matrix3x3x3[i][j][z]= i+j+z;
        }
    }
}

解释:

  • 1.由于js本身只支持一维数组,并不支持矩阵,但是js数组并不是强类型,所以可以在数组内嵌套数组,以此来达到形成多维数组的目的。
  • 2.由代码段中的循环我们可以知道,想要构造多维数组,只需要计算清楚对应的循环嵌套位置即可;

一些数组方法(核心)

  • concat() 将两个或以上数组拼接起来,并返回结果

  • every() 对数组内的每个元素执行给定函数,如果所有元素的执行函数结果都为true,那么every()返回true.

  • filter() 对数组内的每个元素执行给定函数,返回一个包括所有执行结果为真的元素的数组.

  • forEach() 对数组内的每个元素执行给定函数,no returns.

  • map() 对数组内的每个元素执行给定函数,返回一个包括所有函数调用结果的数组

  • some() 对数组内的每个元素执行给定函数,只要有一项元素返回true,那么some()便返回true。

  • join() 将所有数组元素拼接成字符串。

  • indexOf() 返回第一个和给定参数相等的元素的索引,没有则返回-1

  • lastIndexOf() 返回最大的和给定参数相等的元素的索引

  • reverse() 颠倒当前数组顺序

  • slice() 传入索引值,将对应索引范围内的元素返回成一个新的数组

  • toString() 将数组作为字符串返回

  • valueOf() 和toString()类似

ES6 新数组方法

箭头函数

  • 可以用箭头函数来简化原来的一些简单函数:
numbers.forEach(x=>{
    console.log((x%2==0));
})
//这两段代码功能是完全一样的
numbers.forEach(function (x){
    console.log(x%2==0);
})

for...of

for (let n of numbers) {
    console.log((n%2 == 0)? 'even' :'odd');
}
//可以不再使用 
for (let i = 0;i <= numbers.length; i++) {
	console.log((n%2 == 0)? 'even' :'odd');
}

新的迭代器 @@iterator

  • ES6增加了一个@@iterator属性,需要通过Symbol.iterator来访问
let iterator = numbers[Symbol.iterator]();
for (let n of numbers){
    console.log(iterator.next().value);
}

  • 不断调用next方法就能依次得到数组中的值

entries() keys() values()方法

  • entries方法返回包含键值对的@@iterator:
let aEntries = numbers.entries();
for (let n of numbers){
    console.log(aEntries.next().value);
    //show[position,value] like [0,1]
}
  • keys方法返回包含数组引索的@@iterator:
let aKeys = numbers.keys();
for (let n of numbers){
    console.log(aKeys.next());
    //shows [position,done] like [value:0,done:false]
    //if done==false its tell us it still in iterate.
}
  • values方法返回包含数组值的@@iterator:
let aValues =numbers.values();
for (let n of numbers){
    console.log(aValues.next());
    //shows [value,done] like [value:0,done:false]
    //if done==false its tell us it still in iterate.
}

from() Array.of() 方法

  • from()可以从旧数组中创建一个新的数组
  • from()可以通过对旧数组添加方法或者filter来创建新数组
  • Array.of()根据传入参数创建一个新数组
  • Array.of()同样可以复制数组
let numbers2 =Array.from(numbers);
//和旧数组一样
let evens = Array.from(numbers,x=>(x%2==0));
//一个新的偶数数组
let numbers3 = Array.of(1,2,3,4);
//it equals let numbers3 = [1,2,3,4];
let numbersCopy = Array.of(...numbers3);
//it also can copy an old array.

fill() copyWithin()方法

  • fill()用静态值填充数组
  • copyWithin()复制数组中部分元素到指定索引位置
  • 请看代码示例:
let numbersCopy = Array.of(1,2,3,4,5,6);
numbersCopy.fill(0);//becomes([0,0,0,0,0,0])
numbersCopy.fill(2,1);//becomes([0,2,2,2,2,2])
numbersCopy.fill(1,3,5);//becomes([0,2,2,1,1,2])
//很方便我们去初始化数组:
let ones = Array(6).fill(1);//becomes([1,1,1,1,1,1])
let copyArray = [1,2,3,4,5,6];
copyArray.copyWithin(0,3);//becomes ([4,5,6,4,5,6])
copyArray = [1,2,3,4,5,6];
copyArray.copyWithin(1,3,5);//becomes([1,4,5,4,5,6])

搜索

  • find()返回第一个返回true的元素的值
  • findIndex()返回第一个返回true的元素的索引
let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
function mul(elem,index,array) {
    return (elem % 13 == 0 );
}
console.log(numbers.find(mul));//13
console.log(numbers.findIndex(mul));//12
  • includes()如果数组里存在某个元素,返回true
console.log(numbers.includes(15));//true
console.log(numbers.includes(20));//false

类型数组

  • 由于在JavaScript中数组并不是强类型,所以可以在数组中放任何数据类型,而类型数组则用于储存单一数据类型。
  • 类型数组在使用上和普通数组并无太大区别,但在使用诸如WebGLAPI、位操作、处理文件、图像的时候,它便可以展现它的威力。
let length = 5;
let int16 =new Int16Array(length);

let array16 = [];
array16.length = length;
for (let i=0; i<length;i++){
    int16[i]=i+1;
}
console.log(int16);

typeArray

小结

  • 不管是什么语言,数组都算是其中比较重要的一个基础数据结构;在JavaScript中,通过一些方法,对数组的一些操作比较简单,这也使得用js来实现堆栈等基础数据结构奠定了基础。