javascript Aray配列オブジェクトの拡張関数コード
7826 ワード
今日はArayオブジェクトの拡張方法を重点的に説明します.
1、直接Aray.prototypeに拡張する
2、配列オブジェクトを自分の方法で拡張する
直接Aray.prototypeに拡張して、直接domオブジェクトに使用することができません.
潔癖症の学生にとっても原始的な生態環境を破壊した:
まずyui操作配列のいくつかの方法を見にきました.ここではソースコードを簡単に剥離して変更しました.
YArray(document.getElements ByTagName);
domオブジェクトを巡回して再配列します.)
配列を巡回して、着信関数があれば、遍歴ごとにcalbackを実行します.
配列をキーに组み立てることで、jsonオブジェクトとして理解できます.
YArray.hash(["a","b",[1,2])
YArray.indexOf
は、同じ値の配列内のインデックス値を返します.
YArray.indexOf([1,2],1)
YArray.numericsort
配列を並べ替えて、小さいときから大きいときまで
[3,1,2].sort(YArray.numericSort);
YArray.some
配列の中の要素はcalBackの処理を通過しましたか?もしあるなら、すぐにtrueに戻ります.一つもないなら、falseに戻ります.
every
filter
forEach
indexOf
lastIndexOf
map
そして私
reduce
reduceRight
Aray.prototype.every
これは先ほどお話ししたYUI種のsome関数と同じです.
Aray.prototype.filter
lastIndexOfとindexOfコードは似ています.最後から巡回します.
以下は‘map’を言います.
var numbers=[1,4,9]
var roots=numbers.map(function(a){return a*2}
Aray.prototype.reduce
Aray.prototype.reduceRight
名を見て旧意を思い,右から左へ.
例えば、よく使うtoString.
Aray拡張は開発に役立つ:
1、直接Aray.prototypeに拡張する
2、配列オブジェクトを自分の方法で拡張する
直接Aray.prototypeに拡張して、直接domオブジェクトに使用することができません.
潔癖症の学生にとっても原始的な生態環境を破壊した:
まず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;
};
})();
Aray原生法により、agumentsをJS配列に変換する他の方法(Domオブジェクトはできません.巡回のみ)
Array.apply(null,arguments);
[].slice.call(arguments,0);
[].splice.call(arguments,0,arguments.length);
[].concat.apply([],arguments);
...
YArray関数は、配列オブジェクトの操作だけでなく、nodeListオブジェクトの操作も可能です.YArray(document.getElements ByTagName);
domオブジェクトを巡回して再配列します.)
a = [];
l = o.length;
for (; starta.push(o[start]);
}
return a;
YArray.each配列を巡回して、着信関数があれば、遍歴ごとにcalbackを実行します.
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
配列の中の要素はcalBackの処理を通過しましたか?もしあるなら、すぐにtrueに戻ります.一つもないなら、falseに戻ります.
YArray.some([3, 1, 2],function(el){
return el < 4;
})
javascript 1.6-1.8組の拡張を見てみましょう.そして、どのように同じ機能を実現するかを勉強します.every
filter
forEach
indexOf
lastIndexOf
map
そして私
reduce
reduceRight
Aray.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;
};
}
配列内の各要素はcalBackの処理を通していますか?もしそうなら、trueに戻ります.もし違うものがあったら、すぐにfalseに戻ります.これは先ほどお話ししたYUI種のsome関数と同じです.
Aray.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;
};
配列を巡回して、関数、反復配列を実行して、各要素はパラメータとしてcalBack方法を実行して、calBack方法によって各要素を処理して、最後に処理後の配列に戻ります.var numbers=[1,4,9]
var roots=numbers.map(function(a){return a*2}
Aray.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;
};
配列要素に与えられた関数を順次呼び出して、最後に値を返します.つまり、与えられた関数は必ず戻り値を使います.Aray.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;
};
これらを除いて、使いたい方法だけでAray.prototypeに追加できます.例えば、よく使うtoString.
Array.prototype.toString = function () {
return this.join('');
};
toJson、uniq、comppact、reverseなども追加できます.Aray拡張は開発に役立つ: