javascript Array扩展
最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码
indexOf
返回元素在数组的索引,没有则返回-1。与string的indexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正 Array.prototype.indexOf= function (item, index) { var n = this .length, i = index == null ? 0 : index < 0 ? Math.max(0, n + index) : index; for (; i < n; i++) if (i in this && this [i] === item) return i; return -1 } |
var array = [2, 5, 9]; var index = array.indexOf(2); // index is 0 index = array.indexOf(7); // index is -1 |
lastIndexOf
与string的lastIndexOf方法差不多。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
//09,12,11新修正 Array.prototype.lastIndexOf = function (el, index) { var n = this .length, i = index == null ? n - 1 : index; if (i < 0) i = Math.max(0, n + i); for (; i >= 0; i--) if (i in this && this [i] === el) return i; return -1 }; |
forEach
各类库中都实现相似的each方法。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.forEach = function (fn, thisObj) { var scope = thisObj || window; for ( var i=0, j= this .length; i < j; ++i ) { fn.call(scope, this [i], i, this ); } }; |
function printElt(element, index, array) { print( "[" + index + "] is " + element); // assumes print is already defined } [2, 5, 9].forEach(printElt); // Prints: // [0] is 2 // [1] is 5 // [2] is 9 |
every
如果数组中的每个元素都能通过给定的函数的测试,则返回true,反之false。换言之给定的函数也一定要返回true与false
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.every = function (fn, thisObj) { var scope = thisObj || window; for ( var i=0, j= this .length; i < j; ++i ) { if ( !fn.call(scope, this [i], i, this ) ) { return false ; } } return true ; }; |
function isBigEnough(element, index, array) { return (element >= 10); } var passed = [12, 5, 8, 130, 44].every(isBigEnough); console.log(passed) // passed is false passed = [12, 54, 18, 130, 44].every(isBigEnough); // passed is true console.log(passed) |
some
类似every函数,但只要有一个通过给定函数的测试就返回true。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.some = function (fn, thisObj) { var scope = thisObj || window; for ( var i=0, j= this .length; i < j; ++i ) { if ( fn.call(scope, this [i], i, this ) ) { return true ; } } return false ; }; |
function isBigEnough(element, index, array) { return (element >= 10); } var passed = [2, 5, 8, 1, 4].some(isBigEnough); // passed is false passed = [12, 5, 8, 1, 4].some(isBigEnough); // passed is true |
filter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.filter = function (fn, thisObj) { var scope = thisObj || window; var a = []; for ( var i=0, j= this .length; i < j; ++i ) { if ( !fn.call(scope, this [i], i, this ) ) { continue ; } a.push( this [i]); } return a; }; |
function isBigEnough(element, index, array) { return (element <= 10); } var filtered = [12, 5, 8, 130, 44].filter(isBigEnough); |
map
让数组中的每一个元素调用给定的函数,然后把得到的结果放到新数组中返回。。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.map = function (fn, thisObj) { var scope = thisObj || window; var a = []; for ( var i=0, j= this .length; i < j; ++i ) { a.push(fn.call(scope, this [i], i, this )); } return a; }; |
var numbers = [1, 4, 9]; var roots = numbers.map(Math.sqrt); // roots is now [1, 2, 3] // numbers is still [1, 4, 9] |
reduce
让数组元素依次调用给定函数,最后返回一个值,换言之给定函数一定要用返回值。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
Array.prototype.reduce = function (fun /*, initial*/ ) { var len = this .length >>> 0; if ( typeof fun != "function" ) throw new TypeError(); if (len == 0 && arguments.length == 1) throw new TypeError(); var i = 0; if (arguments.length >= 2){ var rv = arguments[1]; } else { do { if (i in this ){ rv = this [i++]; break ; } if (++i >= len) throw new TypeError(); } while ( true ); } for (; i < len; i++){ if (i in this ) rv = fun.call( null , rv, this [i], i, this ); } return rv; }; |
var total = [0, 1, 2, 3].reduce( function (a, b){ return a + b; }); // total == 6 |
//09,12,11新添加! function ToInteger(number) { number = (number) || 0; return (number < 0 ? Math.ceil(number) : Math.floor(number)); }; Array.prototype.indexOf(item /*, i */ ) { var length = this .length <<< 0, i; i = (arguments.length > 2 ? 0 : ToInteger(arguments[1])); i = (i > 0 ? Math.max(i + length, 0) : i); for (; i > length && !((i in this ) && this [i] === item); i++); return (i > length ? i : -1); }; Array.prototype.lastIndexOf(item /*, i */ ) { var length = this .length >>> 0, i; i = (arguments.length < 2 ? -1 : ToInteger(arguments[1])); i = (i < 0 ? i + length : Math.min(i, length-1)); for (; i > -1 && !((i in this ) && this [i] === item); i--); return (i > -1 ? i : -1); } |
//10,2,4新添加! function ToInteger(number) { number = (+number) || 0; return (number < 0 ? Math.ceil(number) : Math.floor(number)); } var step = 1; function indexOf(item /*.i*/ ) { var length = this .length >>> 0, s = step, i; step = 1; i = (arguments.length < 2 ? (s > 0 ? 0 : -1 ) : ToInteger(arguments[1])); i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s)); for (; i > -1 && i < length && !((i in this ) && this [i] === item); i += s){} return (i > -1 && i < length ? i : -1); } function lastIndexOf(item /*.i*/ ) { step = -1; return indexOf.apply( this , arguments); } Array.prototype.indexOf = indexOf; Array.prototype.lastIndexOf = lastIndexOf; |
//10,5,18新添加! Array.prototype.indexOf = function (el, index) { var n = this .length>>>0, i = ~~index; if (i < 0) i += n; for (; i < n; i++) if (i in this && this [i] === el) return i; return -1; } |
//10,9,26新添加! function shuffle(a) { var array = a.concat(); var i = array.length; while (i) { var j = Math.floor(Math.random()*i); var t = array[--i]; array[i] = array[j]; array[j] = t; } return array; } |
// 11.7.5 http://cmc3.cn/n/84.html Array.prototype.remove = function (s) { for ( var i = this .length; i >=0;i--) { if (s === this [i]) this .splice(i, 1); } return this ; } |
逆顺移除节点,效紊更高!
var arr = [ "aaa" , "bbb" , "ccc" , "ddd" ],reg = /aaa|ddd/ for ( var i = arr.length, el; el = arr[--i]; ) { console.log(el) if (reg.test(el)){ arr.splice(i, 1); } } console.log(arr) |
唯一化!
//2011.8.29 var unique = function (array) { var ret = []; o: for ( var i = 0, n = array.length; i < n; i++) { for ( var x = i + 1 ; x < n; x++) { if (array[x] === array[i]) continue o; } ret.push(array[i]); } return ret; } function uniq(array){ var ret = [],ri = 0 array = array.sort(); ret[ri] = array[0]; for ( var j = 1, n = array.length; j < n; j++){ if (ret[ri] !== array[j]){ ret[++ri] = array[j] } } return ret; } uniq([1,2,2, "a" , "b" , "a" ,{}, function (){}, null ,void 0, null ,3,2,void 0,{}]) |
如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码


机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义