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);
}
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);
小结
- 不管是什么语言,数组都算是其中比较重要的一个基础数据结构;在JavaScript中,通过一些方法,对数组的一些操作比较简单,这也使得用js来实现堆栈等基础数据结构奠定了基础。
- 数据结构学习笔记(二)和(三)将会使用js的数组来理解堆栈结构。
写在结尾
- 本学习笔记供爱好者学习参考使用,如需转载请联系作者知晓
- 作者:YoloKayl33
- wechat:secretLWXKY
发表评论
还没有评论,快来抢沙发吧!