`

详解JavaScript中的Array扩展

    博客分类:
  • js
阅读更多
Java script中的Array扩展,一般都是从对象本身入手。这里我们将介绍一些Array对象中的一些东西,比如indexOf是返回元素在数组的索引,没有则返回-1等等。

最近看了一下developer.mozilla.org里的东西,发现它为Array扩展添加了不少generic method,赶得上Prototype的热心程度。

indexOf

返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.indexOf = function(el, start) {  
  2.   var startstart = start || 0;   
  3.   for ( var i=0; i < this.length; ++i ) {   
  4.       if ( this[i] === el ) {   
  5.           return i;   
  6.      }   
  7.   }   
  8.   return -1;   
  9. }; 
  10. var array = [2, 5, 9];  
  11. var index = array.indexOf(2);  
  12. // index is 0  
  13. index = array.indexOf(7);  
  14. // index is -1
复制代码
lastIndexOf

与string的lastIndexOf方法差不多。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.lastIndexOf = function(el, start) {  
  2.   var startstart = start || this.length;   
  3.   if ( start >= this.length ) {   
  4.       start = this.length;   
  5.   }   
  6.  if ( start < 0 ) {   
  7.        start = this.length + start;   
  8.   }   
  9.  for ( var i=start; i >= 0; --i ) {   
  10.       if ( this[i] === el ) {   
  11.         return i;   
  12.     }   
  13.  }   
  14.   return -1;   
  15. };

forEach

各类库中都实现相似的each方法。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.forEach = function(fn, thisObj) {  
  2.   var scope = thisObj || window;   
  3.   for ( var i=0, j=this.length; i < j; ++i ) {   
  4.       fn.call(scope, this[i], i, this);   
  5.  }   
  6. }; 
  7. function printElt(element, index, array) {  
  8.   print("[" + index + "] is " + element); // assumes print is already defined   
  9. }  
  10. [2, 5, 9].forEach(printElt);  
  11. // Prints:  
  12. // [0] is 2  
  13. // [1] is 5  
  14. // [2] is 9

every

如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.every = function(fn, thisObj) {  
  2.  var scope = thisObj || window;   
  3.   for ( var i=0, j=this.length; i < j; ++i ) {   
  4.       if ( !fn.call(scope, this[i], i, this) ) {   
  5.           return false;   
  6.       }   
  7.   }   
  8.   return true;   
  9. }; 
  10. function isBigEnough(element, index, array) {  
  11.  return (element >= 10);   
  12. }  
  13. var passed = [12, 5, 8, 130, 44].every(isBigEnough);  
  14. console.log(passed)  
  15. // passed is false  
  16. passed = [12, 54, 18, 130, 44].every(isBigEnough);  
  17. // passed is true  
  18. console.log(passed)

some

类似every函数,但只要有一个通过给定函数的测试就返回true。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.some = function(fn, thisObj) {  
  2.   var scope = thisObj || window;   
  3.   for ( var i=0, j=this.length; i < j; ++i ) {   
  4.       if ( fn.call(scope, this[i], i, this) ) {   
  5.           return true;   
  6.      }   
  7.   }   
  8.   return false;   
  9. }; 
  10. function isBigEnough(element, index, array) {  
  11.  return (element >= 10);   
  12. }  
  13. var passed = [2, 5, 8, 1, 4].some(isBigEnough);  
  14. // passed is false  
  15. passed = [12, 5, 8, 1, 4].some(isBigEnough);  
  16. // passed is true

filter

把符合条件的元素放到一个新数组中返回。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.filter = function(fn, thisObj) {  
  2.   var scope = thisObj || window;   
  3.  var a = [];   
  4.   for ( var i=0, j=this.length; i < j; ++i ) {   
  5.      if ( !fn.call(scope, this[i], i, this) ) {   
  6.           continue;   
  7.      }   
  8.       a.push(this[i]);   
  9.   }   
  10.  return a;   
  11. }; 
  12. function isBigEnough(element, index, array) {  
  13.  return (element <= 10);   
  14. }  
  15. var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);

map

让数组中的每一个元素调用给定的函数,然后把得到的结果放到新数组中返回。。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.map = function(fn, thisObj) {  
  2.   var scope = thisObj || window;   
  3.   var a = [];   
  4.  for ( var i=0, j=this.length; i < j; ++i ) {   
  5.      a.push(fn.call(scope, this[i], i, this));   
  6.   }   
  7.   return a;   
  8. }; 
  9. var numbers = [1, 4, 9];  
  10. var roots = numbers.map(Math.sqrt);  
  11. // roots is now [1, 2, 3]  
  12. // numbers is still [1, 4, 9]

reduce

让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值。

如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
  1. Array.prototype.reduce = function(fun /*, initial*/)  
  2. {  
  3.  var len = this.length >>> 0;   
  4. if (typeof fun != "function")  
  5.   throw new TypeError();   
  6. if (len == 0 && arguments.length == 1)  
  7.  throw new TypeError();   
  8. var i = 0;  
  9.  if (arguments.length >= 2){   
  10.   var rv = arguments[1];   
  11.  } else{   
  12.  do{   
  13.    if (i in this){   
  14.      rv = this[i++];   
  15.       break;   
  16.    }   
  17.   if (++i >= len)   
  18.       throw new TypeError();   
  19.  }while (true);   
  20.  }   
  21.  for (; i < len; i++){   
  22.  if (i in this)   
  23.    rv = fun.call(null, rv, this[i], i, this);   
  24.  }   
  25.  return rv;   
  26. }; 
  27. var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });  
  28. // total == 6
分享到:
评论

相关推荐

    JavaScript中的some()方法使用详解

    JavaScript数组some()方法测试数组中的某个元素是否通过由提供的功能来实现测试。 语法 array.some(callback[, thisObject]); 下面是参数的详细信息: callback : 函数用来测试每个元素。 thisObject : 对象作为...

    JavaScript详解(第2版)

    1.4 JavaScript及其在Web页面中的位置 3 1.5 Ajax是什么 5 1.6 JavaScript是什么样子的 6 1.7 JavaScript及其在Web开发中承担的角色 7 1.8 JavaScript和事件 9 1.9 标准化JavaScript和W3C 11 1.9.1 ...

    详解JavaScript中的every()方法

    JavaScript 数组中的每个方法测试数组中的所有元素...这种方法是一个JavaScript扩展到ECMA-262标准;因此它可能不存在在标准的其他实现。为了使它工作,你需要添加下面的脚本的代码在顶部: if (!Array.prototype.every

    详解JavaScript中的forEach()方法的使用

    JavaScript数组的 forEach()方法调用数组中的每个元素。 语法 array.forEach(callback[, thisObject]); 下面是参数的详细信息: callback : 函数测试数组的每个元素。 thisObject : 对象作为该执行回调时使用。 ...

    【JavaScript源代码】详解JS变量存储深拷贝和浅拷贝.docx

     目录 变量类型与存储空间栈内存和堆内存基本数据类型引用类型图解存储空间引用类型的赋值深拷贝和浅拷贝深拷贝浅拷贝对象的赋值三者对比浅拷贝的常用的五种方法Object.assign()扩展运算符Array.prototype.slice...

    JavaScript中reduce()方法的使用详解

    JavaScript 数组reduce()方法同时应用一个函数针对数组...这种方法是一个JavaScript扩展到ECMA-262标准; 因此它可能不存在在标准的其他实现。为了使它工作,你需要添加下面的脚本代码的顶部: if (!Array.prototype.re

    php网络开发完全手册

    12.5 在JavaScript中调用PHP程序 196 12.5.1 页面的跳转 196 12.5.2 隐性调用PHP程序 196 12.6 JavaScript和PHP的综合实例——表单 12.6 验证 197 12.6.1 表单设计 197 12.6.2 JavaScript代码设计 199 12.6.3 PHP...

    asp.net知识库

    Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步...

    jQuery权威指南-源代码

    内容全面、丰富、翔实,不仅由浅入深地讲解了jQuery的所有必备基础知识,还介绍了jQuery UI等扩展知识以及jQuery开发中的技巧与性能优化方面的高级知识。 本书极其注重实战,因为动手实践才是掌握一门新技术的最...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    对象在内存中存在形式 函数传递对象方式 8-26 3.函数传递基本数据类型和数组方式 成员方法① 8-26 4.成员方法② 8-26 5.作业评讲 8-27 mysql1 8-27 mysql2 8-28 1.mysql 8-28 2.mysql 8-28 3.mysql 8-28 4.mysql 8-...

    史上最全传智播客PHP就业班视频课,8月份视频

    对象在内存中存在形式 函数传递对象方式 8-26 3.函数传递基本数据类型和数组方式 成员方法① 8-26 4.成员方法② 8-26 5.作业评讲 8-27 mysql1 8-27 mysql2 8-28 1.mysql 8-28 2.mysql 8-28 3.mysql 8-28 4.mysql 8-...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    对象在内存中存在形式 函数传递对象方式 8-26 3.函数传递基本数据类型和数组方式 成员方法① 8-26 4.成员方法② 8-26 5.作业评讲 8-27 mysql1 8-27 mysql2 8-28 1.mysql 8-28 2.mysql 8-28 3.mysql 8-28 4.mysql 8-...

    (全)传智播客PHP就业班视频完整课程

    对象在内存中存在形式 函数传递对象方式 8-26 3.函数传递基本数据类型和数组方式 成员方法① 8-26 4.成员方法② 8-26 5.作业评讲 8-27 mysql1 8-27 mysql2 8-28 1.mysql 8-28 2.mysql 8-28 3.mysql 8-28 4.mysql 8-...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    对象在内存中存在形式 函数传递对象方式 8-26 3.函数传递基本数据类型和数组方式 成员方法① 8-26 4.成员方法② 8-26 5.作业评讲 8-27 mysql1 8-27 mysql2 8-28 1.mysql 8-28 2.mysql 8-28 3.mysql 8-28 4.mysql 8-...

    Tcl_TK编程权威指南pdf

    array命令 使用数组来构建数据结构 第9章 对文件和程序的操作 使用exec运行程序 file命令 跨平台的文件命名方式 操作文件和目录 文件属性 对i/o命令的总结 打开文件用于i/o操作 读写操作 当前目录-cd和...

Global site tag (gtag.js) - Google Analytics