JavaScipt 数据结构 (Ⅰ)数组
定义数组
- 在js中定义数组较为简单:
var name = [];
简单的斐波那契数列
var fibonacci = []
fibonacci[1] = 1
fibonacci[2] = 2
//Access elements and iterate arrays
for (let i = 3
fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]
}
for (let i = 1
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
matrix3x3x3[i] = []
for (var j=0
matrix3x3x3[i][j] = []
for (var z=0
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
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);
numbersCopy.fill(2,1);
numbersCopy.fill(1,3,5);
let ones = Array(6).fill(1);
let copyArray = [1,2,3,4,5,6];
copyArray.copyWithin(0,3);
copyArray = [1,2,3,4,5,6];
copyArray.copyWithin(1,3,5);
搜索
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))
console.log(numbers.findIndex(mul))
includes()如果数组里存在某个元素,返回true
console.log(numbers.includes(15));
console.log(numbers.includes(20));
类型数组
- 由于在JavaScript中数组并不是强类型,所以可以在数组中放任何数据类型,而类型数组则用于储存单一数据类型。
- 类型数组在使用上和普通数组并无太大区别,但在使用诸如WebGLAPI、位操作、处理文件、图像的时候,它便可以展现它的威力。
let length = 5
let int16 =new Int16Array(length)
let array16 = []
array16.length = length
for (let i=0
int16[i]=i+1
}
console.log(int16)

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