Rumah hujung hadapan web tutorial js JavaScript程序中Array数组对象的扩展函数实例

JavaScript程序中Array数组对象的扩展函数实例

Nov 28, 2016 pm 01:45 PM
array

我们经常给 String,Function,Array 的原型加上自定义的扩展函数,比如去除字符串空格,数组排序等

今天重点讲下 如何给Array对象扩展

1、直接在Array.prototype 上扩展

2、用自己方法对数组对象进行扩展

直接在Array.prototype上扩展,不能直接对dom对象使用(如:document.getElementsByTagName('div')得到的nodeList);

对有洁癖的同学而言 也破了原始生态环境的 : )

先来看下 yui操作数组的一些方法,这里我对源码简单剥离并改动了下

(function(){
var YArray;

YArray = function(o,idx,arraylike){
var t = (arraylike) ? 2 : YArray.test(o),
l, a, start = idx || 0;
if (t) {
try {
return Array.prototype.slice.call(o, start); //借助Array原生方法来把aguments转换为JS数组
} catch(e) {
a = [];
l = o.length;
for (; starta.push(o[start]);
}
return a;
}
} else {
return [o];
}

}

YArray.test = function(o){
var r = 0;
if (o && (typeof o == 'object' ||typeof o == 'function')) {
if (Object.prototype.toString.call(o) === "[object Array]") {
r = 1;
} else {
try {
if (('length' in o) && !o.tagName && !o.alert && !o.apply) {
r = 2;
}
} catch(e) {}
}
}
return r;
}

YArray.each = (Array.prototype.forEach) ? //先检测浏览器是否已支持,若有则调用原生
function (a, f, o) {
Array.prototype.forEach.call(a || [], f, o || Y);
return YArray;
} :
function (a, f, o) {
var l = (a && a.length) || 0, i;
for (i = 0; i < l; i=i+1) {
f.call(o || Y, a[i], i, a);
}
return YArray;
};

YArray.hash = function(k, v) {
var o = {}, l = k.length, vl = v && v.length, i;
for (i=0; iif (k[i]) {
o[k[i]] = (vl && vl > i) ? v[i] : true;
}
}

return o;
};

YArray.indexOf = (Array.prototype.indexOf) ?
function(a, val) {
return Array.prototype.indexOf.call(a, val);
} :
function(a, val) {
for (var i=0; iif (a[i] === val) {
return i;
}
}
return -1; //寻找不到的情况
};

YArray.numericSort = function(a, b) {
return (a - b); //从小到大排序, return (b - a); 从大到小
};

YArray.some = (Array.prototype.some) ?
function (a, f, o) {
return Array.prototype.some.call(a, f, o);
} :
function (a, f, o) {
var l = a.length, i;
for (i=0; iif (f.call(o, a[i], i, a)) {
return true;
}
}
return false;
};

})();

借助Array原生方法来把aguments转换为JS数组的其他方法 (Dom对象不可以,只有遍历)


Array.apply(null,arguments);
[].slice.call(arguments,0);
[].splice.call(arguments,0,arguments.length);
[].concat.apply([],arguments);
...


YArray函数不仅可以操作数组对象也对nodeList对象进行了操作
YArray(document.getElementsByTagName("div"));
遍历dom对象 重新组装成一个数组 : )


a = [];
l = o.length;
for (; starta.push(o[start]);
}
return a;


YArray.each
遍历数组,如有传入函数,每次遍历都执行callback


YArray.each([1,2,3],function(item){
alert(item);// 执行了3次,1,2,3
});


YArray.hash
数组 组装成 键值对 可以理解成一个json对象
YArray.hash(["a","b"],[1,2]);

YArray.indexOf
返回(想要找寻值)一样的该值在数组的索引值

YArray.indexOf([1,2],1)
YArray.numericSort
对数组进行排序,从小到大
[3, 1, 2].sort(YArray.numericSort);
YArray.some
是否数组中的有元素通过了callBack的处理?如果有,则立马返回true,如果一个都没有,则返回false


YArray.some([3, 1, 2],function(el){
return el < 4;
})


让我们看看 javascript 1.6 -1.8 对数组的扩展 ,并学习如何实现相同的功能
every
filter
forEach
indexOf
lastIndexOf
map
some
reduce
reduceRight

Array.prototype.every


if (!Array.prototype.every)
{
Array.prototype.every = function(fun /*, thisp*/)
{
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this &&
!fun.call(thisp, this[i], i, this))
return false;
}
return true;
};
}


是否数组中的每个元素都通过了callBack的处理?如果是,则返回true,如果有一个不是,则立马返回false
这和我们刚才提到的YUI种的 some 函数 很雷同 :) 功能刚好相反

Array.prototype.filter


Array.prototype.filter = function (block /*, thisp */) { //过滤器 ,添加方便,进行判断过滤
var values = [];
var thisp = arguments[1];
for (var i = 0; i < this.length; i++)
if (block.call(thisp, this[i]))
values.push(this[i]);
return values;
};


使用方法


var val= numbers.filter(function(t){
return t < 5 ;
})
alert(val);


forEach 和 indexOf 和 some 可以参考 上面yui的代码 ,不再重述
lastIndexOf 和 indexOf 代码相似 只是从最后开始遍历

下面讲下 ‘ map'


Array.prototype.map = function(fun /*, thisp*/) {
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = new Array(len);
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in this)
res[i] = fun.call(thisp, this[i], i, this);
}
return res;
};


遍历数组,执行函数,迭代数组,每个元素作为参数执行callBack方法,由callBack方法对每个元素进行处理,最后返回处理后的一个数组
var numbers = [1, 4, 9];
var roots = numbers.map(function(a){return a * 2});

Array.prototype.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;
};


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

Array.prototype.reduceRight
见名故而思意,从右往左


Array.prototype.reduceRight = 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 = len - 1;
if (arguments.length >= 2) {
var rv = arguments[1];
} else {
do {
if (i in this) {
rv = this[i--];
break;
}
if (--i < 0)
throw new TypeError();
} while (true);
}
for (; i >= 0; i--) {
if (i in this)
rv = fun.call(null, rv, this[i], i, this);
}
return rv;
};


除了这些,只用想用到的方法都能加到Array.prototype上
比如常用的toString


Array.prototype.toString = function () {
return this.join('');
};


还可以添加 toJson ,uniq ,compact,reverse等


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Isih tatasusunan menggunakan fungsi Array.Isih dalam C# Isih tatasusunan menggunakan fungsi Array.Isih dalam C# Nov 18, 2023 am 10:37 AM

Tajuk: Contoh menggunakan fungsi Array.Sort untuk mengisih tatasusunan dalam Teks C#: Dalam C#, tatasusunan ialah struktur data yang biasa digunakan dan operasi pengisihan tatasusunan selalunya diperlukan. C# menyediakan kelas Array, yang mempunyai kaedah Isih untuk menyusun tatasusunan dengan mudah. Artikel ini akan menunjukkan cara menggunakan fungsi Array.Sort dalam C# untuk mengisih tatasusunan dan memberikan contoh kod khusus. Pertama, kita perlu memahami penggunaan asas fungsi Array.Sort. Susunan.Jadi

Cara menggunakan fungsi array_combine dalam PHP untuk menggabungkan dua tatasusunan menjadi tatasusunan bersekutu Cara menggunakan fungsi array_combine dalam PHP untuk menggabungkan dua tatasusunan menjadi tatasusunan bersekutu Jun 26, 2023 pm 01:41 PM

Dalam PHP, terdapat banyak fungsi tatasusunan berkuasa yang boleh menjadikan operasi tatasusunan lebih mudah dan lebih pantas. Apabila kita perlu menggabungkan dua tatasusunan ke dalam tatasusunan bersekutu, kita boleh menggunakan fungsi array_combine PHP untuk mencapai operasi ini. Fungsi ini sebenarnya digunakan untuk menggabungkan kekunci satu tatasusunan sebagai nilai tatasusunan lain ke dalam tatasusunan bersekutu baharu. Seterusnya, kami akan menerangkan cara menggunakan fungsi array_combine dalam PHP untuk menggabungkan dua tatasusunan menjadi tatasusunan bersekutu. Ketahui tentang array_comb

Kaedah mudah dan jelas untuk menggunakan fungsi PHP array_merge_recursive(). Kaedah mudah dan jelas untuk menggunakan fungsi PHP array_merge_recursive(). Jun 27, 2023 pm 01:48 PM

Apabila pengaturcaraan dalam PHP, kita selalunya perlu menggabungkan tatasusunan. PHP menyediakan fungsi array_merge() untuk melengkapkan penggabungan tatasusunan, tetapi apabila kunci yang sama wujud dalam tatasusunan, fungsi ini akan menimpa nilai asal. Untuk menyelesaikan masalah ini, PHP juga menyediakan fungsi array_merge_recursive() dalam bahasa, yang boleh menggabungkan tatasusunan dan mengekalkan nilai kunci yang sama, menjadikan reka bentuk program lebih fleksibel. array_merge

Penjelasan terperinci tentang penggunaan fungsi PHP array_fill(). Penjelasan terperinci tentang penggunaan fungsi PHP array_fill(). Jun 27, 2023 am 08:42 AM

Dalam pengaturcaraan PHP, tatasusunan ialah struktur data yang sangat penting yang boleh mengendalikan sejumlah besar data dengan mudah. PHP menyediakan banyak fungsi berkaitan tatasusunan, array_fill() adalah salah satu daripadanya. Artikel ini akan memperkenalkan secara terperinci penggunaan fungsi array_fill(), serta beberapa petua dalam aplikasi praktikal. 1. Gambaran keseluruhan fungsi array_fill() Fungsi array_fill() adalah untuk mencipta tatasusunan nilai yang sama dengan panjang yang ditentukan. Secara khusus, sintaks fungsi ini ialah

Pengenalan kepada cara menggunakan fungsi PHP array_change_key_case(). Pengenalan kepada cara menggunakan fungsi PHP array_change_key_case(). Jun 27, 2023 am 10:43 AM

Dalam pengaturcaraan PHP, tatasusunan ialah jenis data yang kerap digunakan. Terdapat juga beberapa fungsi operasi tatasusunan, termasuk fungsi array_change_key_case(). Fungsi ini boleh menukar kes nama kunci dalam tatasusunan untuk memudahkan pemprosesan data kami. Artikel ini akan memperkenalkan cara menggunakan fungsi array_change_key_case() dalam PHP. 1. Sintaks fungsi dan tatasusunan_ubah_ke parameter

Cara menggunakan modul Array dalam Python Cara menggunakan modul Array dalam Python May 01, 2023 am 09:13 AM

Modul tatasusunan dalam Python ialah tatasusunan yang dipratentukan, jadi ia mengambil lebih sedikit ruang dalam ingatan daripada senarai standard, dan juga boleh melaksanakan operasi peringkat elemen pantas seperti menambah, memadam, mengindeks dan menghiris. Selain itu, semua elemen dalam tatasusunan adalah daripada jenis yang sama, jadi anda boleh menggunakan fungsi operasi berangka yang cekap yang disediakan oleh tatasusunan, seperti mengira nilai purata, maksimum dan minimum. Selain itu, modul tatasusunan juga menyokong menulis dan membaca objek tatasusunan terus ke dalam fail binari, yang menjadikannya lebih cekap apabila memproses sejumlah besar data berangka. Oleh itu, jika anda perlu memproses sejumlah besar data homogen, anda boleh mempertimbangkan untuk menggunakan modul tatasusunan Python untuk mengoptimumkan kecekapan pelaksanaan kod anda. Untuk menggunakan modul tatasusunan, anda perlu terlebih dahulu

Apakah punca biasa ArrayIndexOutOfBoundsException di Java? Apakah punca biasa ArrayIndexOutOfBoundsException di Java? Jun 24, 2023 pm 10:39 PM

Java adalah bahasa pengaturcaraan yang sangat berkuasa yang digunakan secara meluas dalam pelbagai bidang pembangunan. Walau bagaimanapun, semasa pengaturcaraan Java, pembangun sering menghadapi pengecualian ArrayIndexOutOfBoundsException. Jadi, apakah punca biasa anomali ini? ArrayIndexOutOfBoundsException ialah pengecualian masa jalan biasa di Jawa. Ini bermakna apabila mengakses data, subskrip tatasusunan melebihi julat tatasusunan. Sebab biasa termasuk

Apakah punca biasa ArrayStoreException di Java? Apakah punca biasa ArrayStoreException di Java? Jun 25, 2023 am 09:48 AM

Dalam pengaturcaraan Java, tatasusunan ialah struktur data yang penting. Tatasusunan boleh menyimpan berbilang nilai dalam satu pembolehubah, dan yang lebih penting setiap nilai boleh diakses menggunakan indeks. Tetapi semasa bekerja dengan tatasusunan, beberapa pengecualian mungkin berlaku, salah satunya ialah ArrayStoreException. Artikel ini akan membincangkan punca biasa pengecualian ArrayStoreException. 1. Jenis tidak padan Jenis elemen mesti ditentukan apabila tatasusunan dibuat. Apabila kami cuba menyimpan jenis data yang tidak serasi ke dalam tatasusunan, ia akan membuang

See all articles