js之数组常见的方法
主要介绍数组的一些常用的方法,方法多了,就容易混淆,结果就是方法用错,甚至不会用:
一.数组的定义:
1.字面量/直接量: var arr = [1, 2, 'js', 'java'];
2.通过内部数组对象Array来创建数组: var arr = new Array(length/ content);(注意当括号内传入的仅仅一个值,且其为整数的情况,该值是作为数组长度,而不是数组的第一个元素内容)
二.稀疏数组和密集数组:
1.稀疏数组即数组中存在位置数组未定义,其值为undefined, 而密集数组中每个位置都定义了确定的数值。
2.稀疏数组产生方式:
(1)字面量产生
var arr = [1, 2, ,4,];
console.log(arr.length); //
console.log(arr[2]); // undefined
//注意:如果字面量定义数组,最后一个内容为逗号,则解释器会自动忽略最后一个逗号的存在
(2)针对字面量或数组对象,溢出写产生
var arr = [0, 1, 2];
console.log(arr.length); //
arr[5] = 5;
console.log(arr.length); //
console.log(arr[4]); // undefined
三.类数组:
1.可以利用对象的属性名来模拟数组的特性
2.可以动态的增长length属性
3.如果强行让类数组调用push方法,则会根据了length属性值的位置进行属性的扩充。
var arrObj = {
0: 1,
1: 2,
length: 2,
push: Array.prototype.push,
sort: Array.prototype.sort,
splice: Array.prototype.splice
}
console.log(arrObj.length); //
arrObj.push(3);
console.log(arrObj[2]); //
console.log(arrObj.length); //
//注意:一般在类数组中添加length,push,sort,splice这四个属性,该对象就差不多可以拥有数组的基本特性
四.数组的一些方法及其注意事项:
1.方法分类:
改变原数组的方法:reverse,sort,push,pop,shift,unshift,splice
不改变原数组的方法:concat,join——>split,toString
2.改变原数组的方法:
(1)reverse:数组逆序
var arr = [1, 2, 3, 4, 5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1]
(2)sort:对数组元素 进行排序
/*默认为升序排序*/
var arr = [1, 3, 2, 5, 4];
arr.sort();
console.log(arr); // [1, 2, 3, 4, 5]
// 可传参,参数形式为函数
var arr = [1, 3, 2, 5, 4];
arr.sort(function (a, b){
//return 负数; a, b前后位置不变
//return 正数; a, b前后位置改变
/*
常用:
return a - b; 升序
return b - a; 降序
return Math.random - 0.5; 乱序
*/
});
(3)push: 向数组末尾添加若干个元素
var arr = [1, 2, 3];
arr.push(4, 5);
console.log(arr); //[1, 2, 3, 4, 5]
(4)pop:从数组末尾剪切一个元素,并返回该元素
var arr = [1, 2, 3];
var ret = arr.pop();
console.log(arr); //[1, 2]
console.log(ret); //
(5)unshift:向数组头部添加若干个元素
var arr = [1, 2, 3];
arr.unshift(0, -1);
console.log(arr); //[-1, 0, 1, 2, 3]
(6)shift: 从数组头部剪切一个元素,并返回该元素
var arr = [1, 2, 3];
var ret = arr.shift();
console.log(arr); //[2, 3]
console.log(ret); //
(7)splice(startIndex, length, addElements):从startIndex开始剪切length个元素,并返回,然后从startIndex位置开始添加addElements若干个元素
注意:1.若addElements为一个数组,则该数组会作为一个元素添加进去,而不会拆开该数组一个个添加
2.字符串无法应用该方法,会报错
var arr = [1, 2, 3, 4, 5, 6, 7];
var ret = arr.splice(1, 2); //从索引1位置开始剪切两个元素
console.log(arr); //[1, 4, 5, 6, 7]
console.log(ret); //[2, 3]
var arr = [1, 2, 3, 4, 5, 6, 7];
var ret = arr.splice(1, 2, 3, 2, -1); //从索引1位置开始剪切两个元素, 然后从索引1位置开始添加若干个元素
console.log(arr); //[1, 3, 2, -1, 4, 5, 6, 7]
console.log(ret); //[2, 3]
// 注意:1.索引从0开始; 2.剪切元素包括开始位置; 3.添加的元素个数不一定要和剪切的元素个数一样,可多可少
3.不改变原数组的方法:
(1)concat: 将参数数组拼接到调用该方法的数组后面,形成一个新数组返回
注意:字符串也可应用该方法
var arr1 = [0 , 1, 2];
var arr2 = [3, 4, 5];
var retArr = arr1.concat(arr2); //将arr2数组拼接到arr1后面,形成一个新数组返回
console.log(retArr); // [0 , 1, 2, 3, 4, 5]
(2). join: 将调用该方法的数组中各元素用括号内制定字符连接成为一个字符串返回
var arr = [1, 2, 3, 4];
var ret = arr.join('-'); //将arr数组中的元素用'-'连接起来,形成一个字符串返回; 若不传参,则默认用','拼接起来
console.log(ret); //1-2-3-4
//数组中存在元素为数组,则不正常连接
var arr = [1, 2, 3, 4, [5, 6, 7, 8]];
var ret = arr.join('-');
console.log(ret); // 1-2-3-4-5,6,7,8
应用: 常用concat将多个数组拼接起来,然后利用join方法进行字符串拼接,而不用‘+’运算符进行大量字符串的拼接,因为‘+’运算符效率太低;
4.和数组方法相关的方法:
(1)split(separator, howmany): 将一个字符串根据指定分隔符(separator)分割为一个字符串数组(其中howmany指定返回数组的最大长度)
var str = '1-2-3-4';
var retArr = str.split('-'); //用'-'分隔符来分割str形成一个字符串数组
console.log(retArr); //["1", "2", "3", "4"]
var str = '1-2-3-4';
var retArr = str.split('-',2); //用'-'分隔符来分割str形成一个字符串数组, 返回数组最大长度为2
console.log(retArr); //["1", "2"]
(2)toString: 将调用该方法的值转换为字符串
注意:由于undefined,null没有原型,所以也就没有toString方法,所以除了undefined和null无法调用toString()方法外,其他值均可调用toString()方法;
5.ES5中数组方法:
forEach(), map(), filter(), every(), some(), reduce(), reduceRight(), indexOf(), lastIndexOf()
(1)forEach(): 从头到尾遍历数组,为每个元素调用指定的函数(不修改原数组,也不会返回新数组,仅仅执行指定函数而已)
arrName.forEach(function (value, index, arr)) 其中value为遍历的当前值,index为遍历的当前索引指针,arr为调用forEach的数组
var arr1 = [1, 2, 3, 4];
arr1.forEach(function (value, index, arr) {
console.log('value = ' + value + ' index = ' + index + ' arr = ' + arr);
});
/*
value = 1 index = 0 arr = 1,2,3,4
value = 2 index = 1 arr = 1,2,3,4
value = 3 index = 2 arr = 1,2,3,4
value = 4 index = 3 arr = 1,2,3,4
*/
注意:forEach无法在所有元素都传递给调用的函数之前终止遍历,即无法像在for循环中使用break结束循环,所以若想提前结束循环,必须把forEach方法放到一个try块中,并能抛出一个foreach.break异常,提前终止循环
//通过异常 抛出结束循环
var arr1 = [1, 2, 3, 4];
try {
arr1.forEach(function (value, index){
if (index === 3) {
console.log('try能跳出来吗?');
foreach.break = new Error('StopIteration'); // 在此处手动创造一个自己知道的错误,并通过次错误跳出forEach循环
}else {
console.log(value);
}
});
}catch (e) {
console.log(e.message);
if(e.message === 'foreach is not defined') {
console.log('try可以跳出来了');
}else {
throw e;
}
}
/*
1 1
2
3
try能跳出来吗?
foreach is not defined
try可以跳出来了
*/
(2)map(): 将调用数组的每个元素传递给指定的函数,并返回一个数组,该数组为每个元素经过函数处理的返回值组成(不修改原数组,返回新数组)
arrName.map(function (value, index, arr)) 其中value为遍历的当前值,index为遍历的当前索引指针,arr为调用map的数组
var arr1 = [1, 2, 3, 4];
var retArr = arr1.map(function (value, index, arr) {
return value * value;
})
console.log(retArr); //[1, 4, 9, 16]
(3) filter(), 返回满足一定条件的调用数组的子集,传递的函数是用来逻辑判断的,返回值为true或false,活着能转化为true或false的值,若返回值为true或能转化为true的值,则判定该元素为新子集数组的成员(不修改原数组,返回新数组)
arrName.filter(function (value, index, arr)) 其中value为遍历的当前值,index为遍历的当前索引指针,arr为调用filter的数组
var arr1 = [1, 2, 3, 4];
var retArr = arr1.filter(function (value, index, arr) {
return index < 3; //返回索引小于3的元素 形成一个新数组
});
console.log(retArr); //[1, 2, 3]
(4)some(), every() 对调用数组的逻辑判定, 为满足条件则返回true, 否则返回false
some(function (value, index, arr)), every(function (value, index, arr)) 其中value为遍历的当前值,index为遍历的当前索引指针,arr为调用some | every的数组
some(), every()区别: some()是传入判定函数针对调用数组中的元素判定,只要有一个元素满足判定条件,则返回true,若都不满足判定条件,则返回false
every()是传入判定函数针对调用数组中的数组判定,若所有元素都满足判定条件,则返回true,只要有一个元素不满足条件,则返回false
var arr1 = [1, 2, 3, 4];
var retSome = arr1.some(function (value, index, arr){
return value < 2;
});
console.log(retSome); // true
var retEvery = arr1.every(function (value, index, arr) {
return value < 2;
});
console.log(retEvery); // false
(5)reduce(), reduceRight() 使用指定的函数将数组元素进行组合,生成单个值(不改变原数组,返回一个值)
reduce(function (x, y), sValue) 其中x为到目前为止的化简操作累积的结果, sValue为初始值,当指定初始值时,x刚开始为sValue, 当没有指定初始值时,x刚开始为数组第一个元素, y为在调用数组中紧跟x之后的元素
reduce(), reduceRight()区别:reduce是按数组索引从小到大进行操作,而reduceRight是按数组索引从大到小进行操作
var arr1 = [1, 2, 3, 4];
var retValue = arr1.reduce(function (x, y) {
return x * y;
}, 1);
console.log(retValue); //
(6)indexOf(), lastIndexOf() 搜索整个数组中具有给定值的元素,返回找到的第一个元素的索引,如果没有找到就返回-1
indexOf(serchValue, sIndex); 其中searchValue为 要搜索的值, sIndex可选,为开始搜索的索引位置,若 不填此参数,则从头开始搜索
lastIndexOf(serchValue, offset); 此方法是从末尾开始搜索, offset为可选参数, 且offset为负值, 代表相对数组末尾的偏移量,若不填此参数, 则从 末尾开始搜索
var arr1 = [1, 2, 3, 4];
// indexOf
console.log(arr1.indexOf(3)); //
console.log(arr1.indexOf(3, 2)); //
console.log(arr1.indexOf(5)); // -1
// lastIndexOf
console.log(arr1.lastIndexOf(3)); //
console.log(arr1.lastIndexOf(3, -1)); //
console.log(arr1.lastIndexOf(5)); //-1
js之数组常见的方法的更多相关文章
- 学JS的心路历程 -数组常见处理方法
昨天我们有提到说for-of和forEach可以用来处理数组,但其实还有很多方法可以更快速及精简代码的达到你要的效果. 话不多说,我们赶紧来看吧! Array.prototype.map() 会回传一 ...
- js 常用数组和字符串方法
javascript数组与字符串常用方法总结 最近在梳理js的基础,首先从数组和字符串开始. string 常用方法: 1.substring(start开始位置的索引,end结束位置索引) 截取的位 ...
- JS操作数组常用的方法
JS操作Array对象的方法 concat(arr1,arr2,...):连接数组indexOf(value):返回数组中value的第一个索引join(separator):将数组中所有的元素连接由 ...
- js对数组去重的方法总结-(2019-1)
最近待业在家,系统地学习了一套js的课程.虽然工作时间真的比较长了,但有些东西只局限在知其然而不知其所以然的程度上,有些知识点通过“血和泪”的经验积累下来,也只是记了结果并没有深究,所以每次听完课都有 ...
- JS中数组的迭代方法和归并方法
昨天总结的JavaScript中的数组Array方法 数组的迭代方法 ES5中为数组定义了5个迭代方法.每个方法都要接收两个参数:要在每一项上面运行的函数和(可选的)运行该函数的作用域对象---影响t ...
- js 删除数组几种方法
var arr=['a','b','c']; 若要删除其中的'b',有两种方法: 1.delete方法:delete arr[1] 这种方式数组长度不变,此时arr[1]变为undefined了,但是 ...
- js中数组的splice()方法
在数组中splice方法有增.删.该的多功能用处. var list = []; list.push(1); list.push(2); list.push(3); console.log(list) ...
- JS中数组的拷贝方法
之前在写一个vue的计算属性时,大概是这样: computed: { updateList () { let newList = this.List /*do something*/ return n ...
- JS中数组和字符串方法的简单整理
一.数组: 数组的基本方法: 1.增:arr.unshift() /push() 前增/后增 2.删:arr.shift() /pop ...
随机推荐
- sql server 2016 management studio没有的解决方式
最近安装sql sever2016后发现没有 management studio管理工具,无法操作sql server,可以单独下载安装后即可. 下载地址: https://msdn.microsof ...
- SVN基于一个branch创建新branch
在本地现有Branch(Checkout出来的目录)上,右键SVN,选择Branch/Tags,选择目录.比如https://sadcsc01.pmmr.com/web/Jaguar/branches ...
- RTLviewer与TechnologyMapViewer的区别?
区别: 1.QUARTUS II 中往往要查看RTL Viewer,其实RTLview是编译后的结果,显示的图形都是调用标准单元的结果,这是和思维有关联的显示结果,跟工艺库,FPGA类型,都没有关系: ...
- Json.Net使用JSON Schema验证JSON格式
Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...
- VS2010在C#头文件中添加文件注释的方法
步骤: 1.VS2010 中找到安装盘符(本人安装目录在D盘,所以以D盘为例)D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\I ...
- Web前端技能
入门必备的技能: 第1项技能:HTML超文本标记语言: 技能要点: HTML文件的结构 HTML文件的编写方法 HTML基本标记 文字与段落标记 框架 使用表单 ...
- Java团队项目总结
Java团队项目总结 1.项目实现情况 项目概述: 我们团队项目准备实现一个有关于大富翁有的游戏程序. 大富翁游戏,以经营权为主要的游戏方式,通过购买经营权与架构经营的星级服务来获得最大的利益,当其他 ...
- php大文件下载
<?php header("Content-Type:text/html;charset:utf-8"); //class FileDownServer{ //$file_n ...
- LNMP系列网站零基础开发记录(一)
[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配 ...
- TF/IDF(term frequency/inverse document frequency)
TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...