文字列スペースの削除、配列の並べ替えなど、カスタム拡張関数を String、Function、Array のプロトタイプに追加することがよくあります。
今日は Array オブジェクトを拡張する方法に焦点を当てます
1。 .prototype
2. 独自のメソッドを使用して配列オブジェクトを拡張します
Array.prototype で直接展開します。DOM オブジェクト (document.getElementsByTagName('div') によって取得されるノードリストなど) では直接使用できません。
潔癖症の人向け 学生にとっては、元の生態環境も破壊しています: )まず、配列を操作する yui のメソッドをいくつか見てみましょう。ここでは、単純にソース コードを削除して変更しました(function(){var YArray)。 ;
var t = (arraylike) ? 2 : YArray.test(o),
l, a, start = idx ||
if (t) {
try {
return Array .prototype.slice.call(o, start); // Array ネイティブ メソッドを使用してアトムを JS 配列に変換します
} catch(e) {
a = [];
l = o.length;
for (; start< ;l; start++) {
a.push(o[start]);
}
return a;
}
} else {
return [o];
}
var r = 0;
if (o && (typeof o == 'オブジェクト' ||typeof o == '関数')) {
if (Object.prototype.toString.call(o) = == "[オブジェクト配列]") {
r = 1;
} else {
try {
if (('length' in o) && !o.tagName && !o.alert && !o.apply) {
r = 2;
}
} catch(e) {}
}
}
return r;
}
関数 (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 f.call(o || Y 、 a[i], i, a);
}
return YArray;
};
var o = {}, l = k.length, vl = v && v.length, i;
for (i=0; i
o[k[i]] = (vl && vl > i) ? v[i] : true;
}
}
};
function(a, val) {
return Array.prototype.indexOf. call(a, val) ;
} :
function(a, val) {
for (var i=0; i
return i;
}
}
return -1; //状況が見つかりません
};
return (a - b);大きいものから小さいものへ、return (b - a); 大きいものから小さいものへ
};
function (a, f, o) {
return Array.prototype.some.call (a, f, o );
} :
function (a, f, o) {
var l = a.length, i;
for (i=0; i
return true;
}
}
return false;
};
[].slice.call(arguments,0);
[].splice.call (arguments,0,arguments .length);
[].concat.apply([],arguments);
...
YArray (document.getElementsByTagName("div "));
DOM オブジェクトをトラバースして配列に再構築します: )
l = o.length;
for (; start
}
return a;
配列を走査し、関数が渡されると、走査ごとにコールバックが実行されます
alert(item);// 3回実行、1,2,3
});
配列はキーと値のペアに組み立てられ、json オブジェクトとして理解できます
YArray.hash(["a","b"],[1,2]);
Returns (検索したいのはvalue) 配列内の値と同じインデックス値
YArray.numericSort
配列を小さい順に並べ替えます
[3, 1, 2].sort(YArray .numericSort);
YArray.some
配列内の要素が callBack 処理を通過するかどうか?存在する場合はすぐに true を返します。存在しない場合は false を返します
return el < 4;
) })
forEach
indexOf
lastIndexOf
map
some
reduce
reduceRight
配列.プロトタイプ。 Every
if (!Array.prototype.every)
{
{
var len = this.length >>> ;
if (typeof fun != "function")
throw new TypeError();
var thisp = argument[1];
for (var i = 0; i
if (i in this &&
!fun.call(thisp, this[i], i, this))
return false;
}
return true;
};
}
配列内のすべての要素が callBack によって処理されましたか?存在する場合は true を返し、そうでない場合はすぐに false を返します。これは、先ほど説明した YUI 関数とよく似ています:) この関数はまったく逆です。
Array.prototype.filter = function (block /*, thisp */) { //追加が簡単な、判定とフィルタリング用のフィルター
var thisp = argument[1];
for (var i = 0; i};
使用法
var val=numbers.filter(function(t){
forEachとindexOf、およびいくつかは参照できます上記の yui コード、いいえ、もう一度繰り返します
lastIndexOf とindexOf コードは似ています。端からたどるだけです
Array.prototype.map = function(fun /*, thisp* /) {
if (typeof fun != "function")
throw new TypeError();var res = new Array(len);
var thisp = argument[1];
Array.prototype.reduce
Array.prototype。 reduce = function(fun /*,Initial*/) {
if (typeof fun != "function")
throw new TypeError();if (len == 0 && argument.length == 1)
throw new TypeError();
if (arguments.length >= 2) {
var rv = argument[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
var len = this.length >>> 0;
if (typeof fun != "function")
if (len == 0 && argument.length = = 1)
throw new TypeError();
if (arguments.length >= 2) {
var rv = argument[1];
} else {
do {
if (i in this) {
rv = this[i--];
break;
}
if (--i 新しい 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
return this.join('')
};
toJson、uniq、compact、reverse などを追加することもできます