JavaScript中数组及其方法总结

307 阅读5分钟

1. JavaScript中Array特点

  • js中数组的每一项可以保存任意类型的数据
  • 数组的大小可以动态调整的,可以随着数据的添加自动增长以容纳新增数据

2. 创建数组的两种基本方法

2.1 使用Array构造函数

var color = new Array()
var color = new Array(10) //创建长度为10的数组
var color = new Array("red","green","blue") //创建包含三个字符串的数组

注: 1.当给构造函数传递的值为一个时,如果该值是数值,则创建对应长度的数组; 如果传递的是其他类型,则会创建包含这个值的只有一项数组

2.使用Array构造函数时,new关键字可以省略

2.2 使用数组字面量表示法

var colors = ["red","green","blue"];
var values = [1,2]
var name = []

3. 数组的判断

4. 数组的方法

4.1 转字符串的方法

(1).数组的toString方法可以取出数组中的每位元素,然后用','拼接成字符串,可以实现数组的扁平化

console.log([1,2,3,4,5].toString()); //1,2,3,4,5
console.log([1,2,[3,[4,5]],6].toString()); //1,2,3,4,5,6

(2).与join方法对比。join添加了参数只能脱去一层

console.log([1,2,3,4,5].join()); //1,2,3,4,5
console.log([1,2,[3,[4,5]],6].join()); //1,2,3,4,5,6
console.log([1,2,[3,[4,5]],6].join("-")); //1-2-3,4,5-6

(3).上述两个方法是将数组转化为字符串,反过来我们可以用split将字符串转化为数组

console.log('hello'.split("")) //['h', 'e', 'l', 'l', 'o']

4.2 堆栈方法

push&pop&unshift&shift

  • push() 返回值是增加数组后的长度
  • pop() 返回值是删除的项目
  • unshift() 在第一位增加 返回值是增加
  • shift() 在第一位删除,返回值是删除的项目

4.3 排序相关方法

reverse sort 乱序(随机排序 )

  • arr.reverse() 返回值是原数组,原数组倒序

  • arr.sort() 返回值是原数组,原数组正序 参数(a -b ) => a-b 正序, 如果是b-a是倒叙。不添加参数即使数组中是数组也会以字符串作为比较。

  • 进行乱序

function compate() {
return Math.random() - 0.5 ; // 返回的是随机的true或者false
}
arr.sort(compate);

4.4 拼接的方法

//concat方法,返回的是新数组,能够实现参数的简单处理。不能处理多维数组
var arr = [1, 2];
arr.concat(3,4) //[1,2,3,4]
[...arr,3,4]// 扩展运算符。为[1,2,3,4]
arr.concat([3,4]) //[1,2,3,4]
arr.concat([3,[4]]) //[1,2,3,Array(1)]

4.5 删改的方法

  • slice:返回一个新的数组。[起始位置,结束位置)左闭右开区间,如果只有一个参数,则一直到结束。接受负值,负值代表从后面数
  • splice: 修改了元数组,返回删除的元素 一个参数表示从开始到结束都删除 两个参数表示开始位置,结束位置 三个参数表示开始位置,结束位置,插入的值

4.6 索引查找方法

indexOf lastIndexOf includes, find() findIndex()

数组迭代方法

forEach map filter some every reduce

  • forEach遍历
//1. forEach没有返回值。第二个参数可以修改this的指向
//2. forEach和for循环的区别,当遍历稀疏数组时,forEach不会遍历空值,for会遍历,值为undefined
//3. for中能够跳出当前循环。而forEach不行,当使用break和continue时会报错。
//4. 类数组不能够使用forEach.可以用[...arguments]或者
//5. forEach()参数的函数中三个参数分别为当前项,当前索引,数组
Array.prototype.forEach.call(argument,item => console.log(item))
[1,2,3,4].forEach(function(item,index,arr){
	console.log(item,index,arr)// 1 0 [1,2,3,4]
})
  • map映射
//用法和forEach类似,第二个参数可以修改this指向
var arr = [1,2,3,4,5];
arr.map(function(item,index,arr){
	return item*2; // 会返回和原数组有对象关系的新数组[2,4,6,8,10]
})

-filter

filter: 用法类似,第二个参数可以修改this指向  
var arr = [1,2,3,4,5];
arr.filter(function(item,index,arr){
	return item>3;   //return+布尔值,由布尔值来决定是否过滤到该项。true则选中,false则为空
})
var arr = [1,2,3,defiend,null,4,5,0]  //undefiend == null 为true
var arr1 = arr.filter(function(item,index,arr){
	return item != undefiend; // 过滤到数组中的null和undefined。 未被初始化undefined,变量声明但是没有赋值。函数未传入实参。  null有值,是空值
})
  • some和every
some()和every()。返回的是布尔值。
var arr = [1,2,3,4,5];
var res1 = arr.some(function(item,index,arr){
	return item%2 === 0;//只要有一个成员通过,返回的是true
})
var res1 = arr.every(function(item,index,arr){
	return item%2 === 0//必须所有成员都通过
})
  • reduce
[0,1,2,3,4].reduce(function(accumulator,currentValue,currentIndex){
	return accumulator+currentValue;
})
//求和
var initialValue = 0;
var sum = [{x:1},{x:2},{x,3}].reduce(
(accumulator,currentValue) => accumulator+currentValue.x
,initialValue);

//二维数组转化为一维数组
var flattened = [[0,1],[2,3],[4,5]].reduce(
	(acc,cur) => arr.concat(cur)
	,[])
	
//计算数组中每个元素出现的次数
var name = ['Alice','Bob','Tiff','Bruce']
var contedNames = name.reduce(function(allNames,name){
	if(name in allNames){
		allNames[name]++;
	}else{
		allNames[name] = 1
	}
	return allNames;
},{})

5稀疏数组和类数组

5.1稀疏数组

稀疏数组的产生: (1)delete 数组元素 (2)声明时没有值 稀疏数组的特点: (1)输出稀疏数组时没有元素的位置显示empty (2)取出数组对应位置的空元素显示undefined

var arr1 = [1,2,3,4,5];
delete arr1[1];
console.log(arr1)  //[1, empty, 3, 4, 5];
var arr2 = [1,2,,4,5];
console.log(arr2)  //[1, 2, empty, 4, 5]
console.log(arr2[2]) // undefiend

5.2类数组

类数组的分类
  • 函数的arguments
  • DOMLIST
  • 字符串
特点
  • 有length属性
  • 可以通过[i]获取对应位置的元素
  • 可以通过Array.prototype.function.call()来调用数组上的元素
function test() {
  console.log(arguments); //此时函数中的argument是一个类数组,类数组是对象。没有数组上面的方法
  arguments.forEach(item => {
    console.log(item);
  });   //Uncaught TypeError: arguments.forEach is not a function
  [...arguments].forEach(item => {
    console.log(item);  //输出1到5
  });  //通过es6扩展运算符将其转换为真正的数组,此时可以使用forEach方法
}
test(1,2,3,4,5)
-----------------------------------------------------------------------------------------------
var str = '12345';
console.log(str[1]) //'2'
Array.prototype.push.call(str,'5') //Cannot assign to read only property 'length' of object '[object String]
//'报错,因为不能够改变string的长度。
Array.prototype.forEach.call(str,function(item){
  console.log(item); // 输出1到5
})