最近看了一下developer.mozilla.org里的东西,发现它为Array对象添加了不少generic method,赶得上Prototype的热心程度。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);
复制代码- 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]
复制代码- 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;
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |