javascript 中关于array的常用方法详解
更新时间:2017年5月9日 10:00 点击:2044
javascript 中关于array的常用方法
最近总结了一些关于array中的常用方法,
其中大部分的方法来自于《JavaScript框架设计》这本书,
如果有更好的方法,或者有关于string的别的常用的方法,希望大家不吝赐教。
第一部分
数组去重,总结了一些数组去重的方法,代码如下:
/** * 去重操作,有序状态 * @param target * @returns {Array} */ function unique(target) { let result = []; loop: for (let i = 0,n = target.length;i < n; i++) { for (let x = i + 1;x < n;x++) { if (target[x] === target[i]) { continue loop; } } result.push(target[i]); } return result; } /** * 去重操作,无序状态,效率最高 * @param target * @returns {Array} */ function unique1(target) { let obj = {}; for (let i = 0,n = target.length; i < n;i++) { obj[target[i]] = true; } return Object.keys(obj); } /** * ES6写法,有序状态 * @param target * @returns {Array} */ function unique2(target) { return Array.from(new Set(target)); } function unique3(target) { return [...new Set(target)]; }
第二部分
数组中获取值,包括最大值,最小值,随机值。
/** * 返回数组中的最小值,用于数字数组 * @param target * @returns {*} */ function min(target) { return Math.min.apply(0,target); } /** * 返回数组中的最大值,用于数字数组 * @param target * @returns {*} */ function max(target) { return Math.max.apply(0,target); } /** * 从数组中随机抽选一个元素出来 * @param target * @returns {*} */ function random(target) { return target[Math.floor(Math.random() * target.length)]; }
第三部分
对数组本身的操作,包括移除值,重新洗牌,扁平化和过滤不存在的值
/** * 移除数组中指定位置的元素,返回布尔表示成功与否 * @param target * @param index * @returns {boolean} */ function removeAt(target,index) { return !!target.splice(index,1).length; } /** * 移除数组中第一个匹配传参的那个元素,返回布尔表示成功与否 * @param target * @param item * @returns {boolean} */ function remove(target,item) { const index = target.indexOf(item); if (~index) { return removeAt(target,index); } return false; } /** * 对数组进行洗牌 * @param array * @returns {array} */ function shuffle(array) { let m = array.length, t, i; // While there remain elements to shuffle… while (m) { // Pick a remaining element… i = Math.floor(Math.random() * m--); // And swap it with the current element. t = array[m]; array[m] = array[i]; array[i] = t; } return array; } /** * 对数组进行平坦化处理,返回一个一维的新数组 * @param target * @returns {Array} */ function flatten (target) { let result = []; target.forEach(function(item) { if(Array.isArray(item)) { result = result.concat(flatten(item)); } else { result.push(item); } }); return result; } /** * 过滤属性中的null和undefined,但不影响原数组 * @param target * @returns {Array.<T>|*} */ function compat(target) { return target.filter(function(el) { return el != null; }) }
第四部分
根据指定条件对数组进行操作。
/** * 根据指定条件(如回调或对象的某个属性)进行分组,构成对象返回。 * @param target * @param val * @returns {{}} */ function groupBy(target,val) { var result = {}; var iterator = isFunction(val) ? val : function(obj) { return obj[val]; }; target.forEach(function(value,index) { var key = iterator(value,index); (result[key] || (result[key] = [])).push(value); }); return result; } function isFunction(obj){ return Object.prototype.toString.call(obj) === '[object Function]'; } // 例子 function iterator(value) { if (value > 10) { return 'a'; } else if (value > 5) { return 'b'; } return 'c'; } var target = [6,2,3,4,5,65,7,6,8,7,65,4,34,7,8]; console.log(groupBy(target,iterator)); /** * 获取对象数组的每个元素的指定属性,组成数组返回 * @param target * @param name * @returns {Array} */ function pluck(target,name) { let result = [],prop; target.forEach(function(item) { prop = item[name]; if (prop != null) { result.push(prop); } }); return result; } /** * 根据指定条件进行排序,通常用于对象数组 * @param target * @param fn * @param scope * @returns {Array} */ function sortBy(target,fn,scope) { let array = target.map(function(item,index) { return { el: item, re: fn.call(scope,item,index) }; }).sort(function(left,right) { let a = left.re, b = right.re; return a < b ? -1 : a > b ? 1 : 0; }); return pluck(array,'el'); }
第五部分
数组的并集,交集和差集。
/** * 对两个数组取并集 * @param target * @param array * @returns {Array} */ function union(target,array) { return unique(target.concat(array)); } /** * ES6的并集 * @param target * @param array * @returns {Array} */ function union1(target,array) { return Array.from(new Set([...target,...array])); } /** * 对两个数组取交集 * @param target * @param array * @returns {Array.<T>|*} */ function intersect(target,array) { return target.filter(function(n) { return ~array.indexOf(n); }) } /** * ES6 交集 * @param target * @param array * @returns {Array} */ function intersect1(target,array) { array = new Set(array); return Array.from(new Set([...target].filter(value => array.has(value)))); } /** * 差集 * @param target * @param array * @returns {ArrayBuffer|Blob|Array.<T>|string} */ function diff(target,array) { var result = target.slice(); for (var i = 0;i < result.length;i++) { for (var j = 0; j < array.length;j++) { if (result[i] === array[j]) { result.splice(i,1); i--; break; } } } return result; } /** * ES6 差集 * @param target * @param array * @returns {Array} */ function diff1(target,array) { array = new Set(array); return Array.from(new Set([...target].filter(value => !array.has(value)))); }
第六部分
数组包含指定目标。
/** * 判定数组是否包含指定目标 * @param target * @param item * @returns {boolean} */ function contains(target,item) { return target.indexOf(item) > -1; }
最后模拟一下数组中的pop,oush,shift和unshift的实现原理
const _slice = Array.prototype.slice; Array.prototype.pop = function() { return this.splice(this.length - 1,1)[0]; }; Array.prototype.push = function() { this.splice.apply(this,[this.length,0].concat(_slice.call(arguments))); return this.length; }; Array.prototype.shift = function() { return this.splice(0,1)[0]; }; Array.prototype.unshift = function() { this.splice.apply(this, [0,0].concat(_slice.call(arguments))); return this.length; };
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 复制代码 代码如下: <script type="text/javascript"> function Person(){}...2014-05-31
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 复制代码 代码如下: //element:需要添加新样式的元素,value:新的样式 function addClass(element, value ){ if (!element.className){ element.className = value; }else { newClassName = element.className; newClas...2014-05-31
- 在javascritp中,不一定只有对象方法的上下文中才有this, 全局函数调用和其他的几种不同的上下文中也有this指代。 它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下...2015-03-15
- 首先,我想到的是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。于是乎,我写出了如下代码A: Array.prototype.clearRepetitionA = function(){ var resul...2015-11-08
- 有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 复制代码 代码如下: var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; } document.write(k); 答案是显示10,这道题主要考察JavaScript的逗...2015-03-15
- 事件触发器从字面意思上可以很好的理解,就是用来触发事件的,但是有些没有用过的朋友可能就会迷惑了,事件不是通常都由用户在页面上的实际操作来触发的吗?这个观点不完全正确,因为有些事件必须由程序来实现,如自定义事件,jQue...2014-06-07
- 1、ActiveX向Javascript传参 复制代码 代码如下: <script language="javascript" for="objectname" event="fun1(arg)"> fun2(arg); </script> objectname为ActiveX控件名,通过<object>标签里的id属性设定,如下; 复制...2014-06-07
- 这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
- 通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。 HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 HTML DOM 模型被构造为对象的树: 通过可编程的对象模型,Java...2015-10-23
- Window有navigator对象让我们得知浏览器的全部信息.我们可以利用一系列的API函数得知浏览器的信息.JavaScript代码如下:function message(){ txt = "<p>浏览器代码名: " + navigator.appCodeName + "</p>";txt+= "<p>...2015-11-24
- 虽然ES6都还没真正发布,但已经有用ES6重写的程序了,各种关于ES789的提议已经开始了,这你敢信。潮流不是我等大众所能追赶的。潮流虽然太快,但我们不停下学习的步伐,就不会被潮流丢下的,下面来领略下ES6中新特性,一堵新生代JS...2015-11-24
- 神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
- ---恢复内容开始---1.location.href.....(1)self.loction.href="http://www.cnblogs.com/url" window.location.href="http://www.cnblogs.com/url" 以上两个用法相同均为在当前页面打开URL页面 (2)this.locati...2015-10-30
- tab切换在网页中很常见,故最近总结了4种实现方法。 首先,写出tab的框架,加上最简单的样式,代码如下: <!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style> *{ pa...2015-11-08
JavaScript学习笔记整理_setTimeout的应用
下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
前言在面向对象的编程范式中,封装都是必不可少的一个概念,而在诸如 Java,C++等传统的面向对象的语言中, 私有成员是实现封装的一个重要途径。但在 JavaScript 中,确没有在语法特性上对私有成员提供支持, 这也使得开发人员使...2015-10-30