javascript Array扩展
最近看了一下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 === item) return i;
return -1
}var array = ;
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 === 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, this);
}
};function printElt(element, index, array) {
print("[" + index + "] is " + element); // assumes print is already defined
}
.forEach(printElt);
// Prints:
// is 2
// is 5
// is 9every
如果数组中的每个元素都能通过给定的函数的测试,则返回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, this) ) {
return false;
}
}
return true;
};function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = .every(isBigEnough);
console.log(passed)
// passed is false
passed = .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, this) ) {
return true;
}
}
return false;
};function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = .some(isBigEnough);
// passed is false
passed = .some(isBigEnough);
// passed is truefilter
把符合条件的元素放到一个新数组中返回。
如果其他浏览器没有实现此方法,可以用以下代码实现兼容:
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, this) ) {
continue;
}
a.push(this);
}
return a;
};function isBigEnough(element, index, array) {
return (element <= 10);
}
var filtered = .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, this));
}
return a;
};var numbers = ;
var roots = numbers.map(Math.sqrt);
// roots is now
// numbers is still 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;
} else{
do{
if (i in this){
rv = this;
break;
}
if (++i >= len)
throw new TypeError();
}while (true);
}
for (; i < len; i++){
if (i in this)
rv = fun.call(null, rv, this, i, this);
}
return rv;
};var total = .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));
i = (i > 0 ? Math.max(i + length, 0) : i);
for (; i > length && !((i in this) && this === 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));
i = (i < 0 ? i + length : Math.min(i, length-1));
for (; i > -1 && !((i in this) && this === 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));
i = (i < 0 ? Math.max(i + length, s - 1) : Math.min(i, length + s));
for (; i > -1 && i < length && !((i in this) && this === 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 === 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 = array;
array = t;
}
return array;
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]