1、什么是数组?
数组的标准定义为:一个存储元素的线性集合(collection),元素可以通过索引来任意存取,索引通常为数字,用来计算元素存储位置的偏移量。 如果你有了解过其他语言,就会知道所有编程语言都有类似的数据结构。但javascript的数组和其他语言有所不同。JavaScript中的数组是一种特殊的对象,索引为该对象的素性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为JavaScript对象的属性名必须是字符串类型。 数组在JavaScript中只是一种特殊的对象,所以效率上不如其他语言中的数组高。JavaScript中的数组,严格来说应该称作对象,是特殊的JavaScript对象,在内部被归类为数组。由于Array在JavaScript中被当作对象,因此它有许多属性和方法可以在编程时使用。
2、使用数组
JavaScript的数组十分的灵活有许多方法可以操作数组,在使用之前首先需要创建数组。
2.1创建数组
法一:通过[]操作符声明一个数组变量
var nums = []
这种方式创建的数组得到的是长度为0的空数组,可以通过数组的length属性来验证这一点
var nums = [1,2,3,4,5]
你也可以通过在[]操作符声明数组的同时,放入一组元素
法二:通过调用Array的构造函数创建数组
let nums = new Array();
console.log(nums.length) //0
同理你也可以在声明时设置初始值:
let nums = new Array(1,2,3,4,5);
console.log(nums.length) //5
在调用Array的构造函数时,可以只传入一个参数,用来指定数组的长度:
let nums = new Array(20);
console.log(nums.length) //20
2.2读写数组
let arr = [] //声明
let sums = 0
for (let i = 0; i < 100; i++) { //赋值
arr[i] = i
}
arr.map((item, i) => { //读取
// console.log(item,i);
sums += item
})
console.log(sums); //4950
2.2.1 由字符串生成数组
调用字符串对象的split()方法也可以生成数组:
let str=`we are family !`
let arr=str.split(" ")
arr.map((item,i)=>{
console.log(`arr${i}:${item}`);
/*输出:
arr0:we
arr1:are
arr2:family
arr3:!
*/
})
2.2.2 对数组的整体性操作
是将数组作为一个整体进行的。比如整体赋值:
let arr = [] //声明
for (let i = 0; i < 10; i++) { //赋值
arr[i] = i
}
let arr2 = arr
但是,使用这种方法把一个数组赋给另外一个数组时,只是为被赋值的数组增加了一个新的引用。当你通过原引用修改了数组的值,另外一个引用也会感知到这个变化,如:
let arr = [] //声明
for (let i = 0; i < 10; i++) { //赋值
arr[i] = i
}
let arr2 = arr
arr[0]=100
console.log(arr1[0]) //100
这种行为被称为浅复制,新数组依然指向原来的数组。一个更好的方案是使用深复制,将原数组中的每一个元素都复制一份到新数组中。如可以写一个函数来深拷贝(复制)数组:
let arr1=[0,1,2,3,4,5,6,7,8,9],arr2=[]
function CopyArr(arr1,arr2){
arr1.map((item,i)=>{
arr2[i]=item
})
return arr2
}
arr2=CopyArr(arr1,arr2)
console.log(arr2); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr1[0]=100
console.log(arr1[0],arr2[0]); //100 0
2.3数组方法
1、JavaScript 方法 toString() 把数组转换为数组值(逗号分隔)的字符串。
2、join() 方法也可将所有数组元素结合为一个字符串。
3、pop() 方法从数组中删除最后一个元素。
4、push() 方法(在数组结尾处)向数组添加一个新的元素。
5、shift() 方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。
6、unshift() 方法(在开头)向数组添加新元素,并“反向位移”旧元素。
7、length 属性提供了向数组追加新元素的简易方法。
8、使用 delete 会在数组留下未定义的空洞。请使用 pop() 或 shift() 取而代之。
9、splice() 方法可用于向数组添加新项,也可删除数组中的元素。
10、concat() 方法通过合并(连接)现有数组来创建一个新数组。
11、slice() 方法用数组的某个片段切出新数组。
12、sort() 方法用于对数组的元素进行排序。
13、reverse() 方法用于颠倒数组中元素的顺序。
14、toLocaleString() 方法把数组转换为本地字符串。
15、valueOf() 方法返回 Array 对象的原始值。
具体用法可见: www.w3school.com.cn/jsref/jsref…
2.4二维和多维数组
JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组。
2.4.1创建二维数组
二维数组类似一种由行和列构成的数据表格。在JavaScript中创建二维数组,需要先创建一个数组,然后让数组的每个元素也是一个数组。我们需要知道二维数组要包含多少行,有了这个信息,就可以创建一个n行1列的二维数组了:
let arr=[]
let rows=5
for(let i=0;i<rows;i++){
arr[i]=[]
}
console.log(arr); // [Array(0), Array(0), Array(0), Array(0), Array(0)]
这样做的问题是,数组中的每个元素都是undefined。更好的方式是遵照JavaScript: The Good Parts(O'Reilly)一书第64页的例子,Crockford通过扩展JavaScript数组对象,为其增加了一个新方法,该方法根据传入的参数,设定了数组的行数、列数和初始值。下面是这个方法的定义:
/*@ params
numrows:行数
numcols:列数
initial:行列对应下的初始值
*/
Array.matrix = function (numrows, numcols, initial) {
let arr = []
for (let i = 0; i < numrows; i++) {
let columns = []
for (let j; j < numcols; j++) {
columns[j] = initial
}
arr[i] = columns
}
return arr
}
let nums = Array.matrix(5,5,0);
console.log(nums[0][0]) //0
对于小规模的数据还是使用这种方式最简单,仅需一行代码即可:
let nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
console.log(nums[2][2]); //9
2.4.2处理二维数组的元素
处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问:
let nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let total = 0
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums[i].length; j++) {
total += nums[i][j]
}
}
console.log(total)
对于多维数组无非是,内循环控制行,外循环控制列。
2.5对象中的数组
在对象中,可以使用数组存储复杂的数据。
function wageTemp() {
this.dataSource = []
this.add = add
this.averag = averag
}
function add(data) {
this.dataSource.push(data)
}
function averag() {
let total = 0
this.dataSource.map(item => {
total += item
})
return total / this.dataSource.length
}
let gzTemp = new wageTemp()
gzTemp.add(100)
gzTemp.add(90)
gzTemp.add(80)
gzTemp.add(88)
gzTemp.add(99)
console.log(gzTemp.averag()); //91.4
(以上内容为阅读《数据结构与算法JavaScript描述》总结笔记,如有雷同,纯属巧合...)
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!