JavaScript数组常用操作技巧汇总


Posted in Javascript onNovember 17, 2014

本文实例汇总了JavaScript数组的常用操作技巧。分享给大家供大家参考。具体如下:

前言

相信大家都用惯了jquery或者underscore等这些类库中常用的数组相关的操作,如$.isArray,_.some,_.find等等方法。这里无非是对原生js的数组操作多了一些包装。
这里主要汇总一下JavaScript数组操作的常用API。相信对大家解决程序问题很有帮助。

一、性质
JavaScript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为JavaScript对象中的属性名必须是字符串。

二、操作

1 判断数组类型

var array0 = [];    // 字面量

var array1 = new Array();   // 构造器

// 注意:在IE6/7/8下是不支持Array.isArray方法的

alert(Array.isArray(array0));

// 考虑兼容性,可使用

alert(array1 instanceof Array);

// 或者

alert(Object.prototype.toString.call(array1) === '[object Array]');

2 数组与字符串

非常简单:由数组转换为字符串,使用join;由字符串转换为数组,使用split。

// join - 由数组转换为字符串,使用join

console.log(['Hello', 'World'].join(','));    // Hello,World

// split - 由字符串转换为数组,使用split

console.log('Hello World'.split(' '));    // ["Hello", "World"]

3 查找元素

相信大家都常用字符串类型indexOf,却很少知道数组的indexOf同样可以用于查找元素。

// indexOf - 查找元素

console.log(['abc', 'bcd', 'cde'].indexOf('bcd'));  // 1
// 

var objInArray = [

    {

        name: 'king',

        pass: '123'

    },

    {

        name: 'king1',

        pass: '234'

    }

];
console.log(objInArray.indexOf({

    name: 'king',

    pass: '123'

}));    // -1
var elementOfArray = objInArray[0];

console.log(objInArray.indexOf(elementOfArray));    // 0

从以上可以看出,对于数组包含对象的这种数组,indexOf方法并非是经过深度比较来得到对应的查找结果,仅仅是比较对应元素的引用。

4 数组连接

使用concat,要注意,使用concat之后会生成一个新的数组。

var array1 = [1, 2, 3];

var array2 = [4, 5, 6];

var array3 = array1.concat(array2); // 实现数组连接之后,会创建出新的数组

console.log(array3);

5 类列表操作

用于添加元素,可分别使用push和unshift,移除元素可分别使用pop和shift。

// push/pop/shift/unshift

var array = [2, 3, 4, 5];
// 添加到数组尾部

array.push(6);

console.log(array); // [2, 3, 4, 5, 6]
// 添加到数组头部

array.unshift(1);

console.log(array); // [1, 2, 3, 4, 5, 6]
// 移除最后一个元素

var elementOfPop = array.pop();

console.log(elementOfPop);   // 6

console.log(array); // [1, 2, 3, 4, 5]
// 移除第一个元素

var elementOfShift = array.shift();

console.log(elementOfShift);   // 1

console.log(array); // [2, 3, 4, 5]

6 splice方法

主要两个用途:
① 从数组中间位置添加和删除元素
② 从原有数组中,获取一个新数组

当然,两个用途是一气合成的,有些场景注重用途一,有些则注重用途二。

从数组中间位置添加和删除元素,splice方法为数组添加元素,需提供如下参数
① 起始索引(也就是你希望开始添加元素的地方)
② 需要删除的元素的个数或者是提取的元素的个数(添加元素时该参数设置为0)
③ 想要添加进数组的元素

var nums = [1, 2, 3, 7, 8, 9];

nums.splice(3, 0, 4, 5, 6);

console.log(nums);  // [1, 2, 3, 4, 5, 6, 7, 8, 9] 

// 紧接着做删除操作或者提取新的数组

var newnums = nums.splice(3, 4);

console.log(nums);  // [1, 2, 3, 8, 9]

console.log(newnums);   // [4, 5, 6, 7]

7 排序

主要介绍reverse和sort两个方法。数组反转使用reverse,sort方法不仅可以用于简单排序,也可以用于复杂排序。

// 反转数组

var array = [1, 2, 3, 4, 5];

array.reverse();

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

我们先对字符串元素的数组进行排序

var arrayOfNames = ["David", "Mike", "Cynthia", "Clayton", "Bryan", "Raymond"];

arrayOfNames.sort();

console.log(arrayOfNames);  // ["Bryan", "Clayton", "Cynthia", "David", "Mike", "Raymond"]

我们对数字元素的数组进行排序
// 如果数组元素时数字类型,sort()方法的排序结果就不能让人满意了

var nums = [3, 1, 2, 100, 4, 200];

nums.sort();

console.log(nums);  // [1, 100, 2, 200, 3, 4]

sort方法是按照字典顺序对元素进行排序的,因此它假定元素都是字符串类型,因此,即使元素是数字类型,也被认为是字符串类型。这时,可以在调用方法时传入一个大小比较函数,排序时,sort()方法将会根据该函数比较数组中两个元素的大小,从而决定整个数组的顺序。
var compare = function(num1, num2) {

    return num1 > num2;

};

nums.sort(compare);

console.log(nums);  // [1, 2, 3, 4, 100, 200]
var objInArray = [

    {

        name: 'king',

        pass: '123',

        index: 2

    },

    {

        name: 'king1',

        pass: '234',

        index: 1

    }

];

// 对数组中的对象元素,根据index进行升序

var compare = function(o1, o2) {

    return o1.index > o2.index;

};

objInArray.sort(compare);

console.log(objInArray[0].index < objInArray[1].index); // true

8 迭代器方法

主要包含forEach和every、some和map、filter
forEach相信大家都会,主要介绍一下其他四种方法。
every方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数均返回true,则该方法返回true。

var nums = [2, 4, 6, 8];

// 不生成新数组的迭代器方法

var isEven = function(num) {

    return num % 2 === 0;

};

// 如果都是偶数,才返回true

console.log(nums.every(isEven)); // true
some方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回true,该方法就返回true。

var isEven = function(num) {

    return num % 2 === 0;

};

var nums1 = [1, 2, 3, 4];

console.log(nums1.some(isEven)); // true

map和filter这两个方法都可以产生新数组,map返回的新数组是对原有元素应用某个函数得到的结果。如:

var up = function(grade) {

    return grade += 5;

}

var grades = [72, 65, 81, 92, 85];

var newGrades = grades.ma

filter方法和every方法很类似,传入一个返回值为布尔类型的函数。和every()方法不同的是,当对数组中的所有元素应用该函数,结果均为true时,该方法并不返回true,而是返回一个新数组,该数组包含应用该函数后结果为true的元素。
var isEven = function(num) {

    return num % 2 === 0;

};

var isOdd = function(num) {

    return num % 2 !== 0;

};

var nums = [];

for (var i = 0; i < 20; i++) {

    nums[i] = i + 1;

}

var evens = nums.filter(isEven);

console.log(evens); // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 

var odds = nums.filter(isOdd);

console.log(odds);  // [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

三、总结

以上还存在某些方法在低级浏览器不支持的问题,还需要再采用其他方法进行兼容实现。

这些都是常见的可能大家不太容易想到的方法。大家不妨多留意一下。

希望本文所述对大家的javascript程序设计有所帮助。

Javascript 相关文章推荐
学习JS面向对象成果 借国庆发布个最新作品与大家交流
Oct 03 Javascript
javascript字符串拼接的效率问题
Dec 25 Javascript
jquery中ajax学习笔记3
Oct 16 Javascript
onclick与listeners的执行先后问题详细解剖
Jan 07 Javascript
javascript的事件触发器介绍的实现
Jun 05 Javascript
js密码强度检测
Jan 07 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
Bootstrap源码解读按钮(5)
Dec 23 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 Javascript
vue使用一些外部插件及样式的配置代码
Nov 18 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 Javascript
jquery 实现返回顶部功能
Nov 17 #Javascript
超棒的响应式布局jQuery插件Freetile.js
Nov 17 #Javascript
jQuery Masonry瀑布流插件使用详解
Nov 17 #Javascript
javascript将url中的参数加密解密代码
Nov 17 #Javascript
PHP使用方法重载实现动态创建属性的get和set方法
Nov 17 #Javascript
PHP PDO操作总结
Nov 17 #Javascript
JavaScript函数详解
Nov 17 #Javascript
You might like
使用apache模块rewrite_module (转)
2007/02/14 PHP
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
jquery操作复选框checkbox的方法汇总
2015/02/05 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
layui在form表单页面通过Validform加入简单验证的方法
2019/09/06 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
python修改字典内key对应值的方法
2015/07/11 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
2019/12/10 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
班队活动设计方案
2014/01/30 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
音乐幼师求职信
2014/07/09 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
优秀团员事迹材料
2014/12/25 职场文书
中秋节晚会开场白
2015/05/29 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python