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 相关文章推荐
JQuery 简便实现页面元素数据验证功能
Mar 24 Javascript
aspx中利用js实现确认删除代码
Jul 22 Javascript
javascript实现div的显示和隐藏的小例子
Jun 25 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
JavaScript——DOM操作——Window.document对象详解
Jul 14 Javascript
Vue.js创建Calendar日历效果
Nov 03 Javascript
微信小程序中单位rpx和rem的使用
Dec 06 Javascript
ES6学习之变量的两种命名方法示例
Jul 18 Javascript
JavaScript闭包的简单应用
Sep 01 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 Javascript
React组件中的this的具体使用
Feb 28 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
Sep 16 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
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
浅谈JSON中stringify 函数、toJosn函数和parse函数
2015/01/26 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
用vue写一个日历
2020/11/02 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python基础教程之字典操作详解
2014/03/25 Python
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
英国在线自行车店:Merlin Cycles
2018/08/20 全球购物
北京-环亚运商测试题.net程序员初步测试题
2013/05/28 面试题
相亲大会策划方案
2014/06/05 职场文书
故宫的导游词
2015/01/31 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
家长通知书家长意见
2015/06/03 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
Django实现聊天机器人
2021/05/31 Python
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
vue判断按钮是否可以点击
2022/04/09 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js