ホームページ  >  記事  >  ウェブフロントエンド  >  プロトタイプ配列オブジェクト learning_prototype

プロトタイプ配列オブジェクト learning_prototype

WBOY
WBOYオリジナル
2016-05-16 18:49:44861ブラウズ
コードをコピーします コードは次のとおりです。

Array.from = $A; >(function () {
//配列プロトタイプの参照
var arrayProto = Array.prototype,
slice = arrayProto.slice,
//JS 1.6 にはネイティブの forEach メソッドがあります
_each = arrayProto.forEach; // 利用可能な場合はネイティブ ブラウザ JS 1.6 実装を使用します

function each(iterator) {
for (var i = 0, length = this.length; i < length; i )
iterator(this[i]);
}
//JS1.6 ではない場合、_each はオブジェクトの each メソッドに設定されます
//ここでの _each メソッドはEnuerable メソッドの _each
if (!_each) _each = each;

function clear() {
this.length = 0;

関数 first() {
return this[0];
}

function last() {
return this[this.length - 1];

//配列内の null ではないデータをすべて返します
function Compact() {
return this.select(function(value) {
return value != null;
}) ;
}

//多次元配列を 1 次元配列に変換します
function flatten() {
return this.inject([], function(array, value) {
if (Object.isArray(value))
return array.concat(value. flatten()) // ここに再帰呼び出しがあります
array.push(value);配列;
});
}

関数 without() {
var 値 = スライス.call(引数, 0);
return this.select( value) {
return !values.include( value);
}

function reverse(inline) {
return (inline !== false ? this : this.toArray())._reverse();
}

//配列内の非反復要素をすべて返します。配列が順序付けされている場合、true パラメーターを渡すとより高速に実行されます。 function uniq(sorted) {
return this.inject([], function(array, value, index) {
if (0 == インデックス || (sorted ? array.last() != value : ! array.include(value)))
array.push(value);
}
}

// 2 つの配列の交差を取得します。 >function intersect(array) {
return this.uniq().findAll(function(item) {
return array.detect(function(value) { return item === value });
} );
}


関数 clone() {
return slide.call(this, 0);

関数 size(); >return this.length;
}

function Inspection() {
return '[' this.map(Object.inspect).join(', ') ']'; }

function toJSON( ) {
var results = [];
this.each(function(object) {
var value = Object.toJSON(object);
if (!Object.isUnknown(value)) 結果 .push(value);
return '[' results.join(', ') ']';

関数 IndexOf(item, i) {
i || (i = 0);
var length = this.length
if (i < 0) i = length i; (; i < length; i )
if (this[i] === item) return i;
return -1;

function lastIndexOf(item, i) {
i = isNaN(i) ? this.length : (i < 0 ? this.length i : i) 1;
var n = this.slice(0, i).reverse().indexOf (項目);
return (n < 0) ? n : i - n - 1;

関数 concat() {
var array = slide.call(this, 0), item;
for ( var i = 0, length = argument.length; i < length; i ) {
item = argument[i]
//2 番目の条件は、呼び出しメソッドの配列要素も連結されます
if (Object.isArray(item) && !('callee' in item)) {
for (var j = 0, arrayLength = item.length; j < arrayLength; j )
array.push(item[j]);
array.push(item);
return array;
}

/ /mixin Enumerable のメソッド
Object.extend(arrayProto, Enumerable);

if (!arrayProto._reverse)
arrayProto._reverse = arrayProto. reverse;

Object.extend(arrayProto, {
_each: _each,
clear: クリア,
first: first,
last: last,
compact,
flatten: 平坦化、
without: なし、
reverse: 逆方向、
uniq: uniq、
intersect: 交差、
clone: クローン、
toArray: クローン,
size: size,
inspect : Inspection,
toJSON: toJSON
});

//このバグをオンラインで見つけられませんでした。それ?
var CONCAT_ARGUMENTS_BUGGY = (function() {
return [].concat(arguments)[0][0] !== 1;
})(1,2)

if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat;

//JS がindexOf メソッドと lastIndexOf メソッドをネイティブにサポートしているかどうかを確認し、サポートしていない場合は、それらをオブジェクト
if (!arrayProto.indexOf) arrayProto 内のメソッドに設定します。インデックスOf = インデックスOf;
if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf =
})();


クリア
クローン
圧縮
それぞれ
最初に
平坦化
から
indexOf
検査
最後の
縮小
反転
size
toArray
toJSON
uniq
without
以下にメソッドの例をいくつか示します。単純なメソッドについては例を示しません。
flatten():
コードをコピー コードは次のとおりです:

['フランク', ['ボブ', 'リサ'], ['ジル', ['トム', 'サリー']]]. flatten()
// -> ['フランク', 'ボブ', 'lisa' , 'jill', 'tom', 'sally']


reduce(): このメソッドの意味は、数値にデータがある場合、そのデータが直接返されます。それ以外の場合は返されます。 元の配列
uniq():
コードをコピー コードは次のとおりです:

['サム', 'ジャスティン', 'アンドリュー', 'ダン', 'サム'].uniq();
// -> ['サム', ' Justin', 'Andrew', 'Dan']

['プロトタイプ', 'プロトタイプ'].uniq();
// -> ['プロトタイプ', 'プロトタイプ'] because String比較は大文字と小文字を区別します


without():
コードをコピー コードは次のとおりです以下のように:

[3, 5, 6, 1, 20].without(3)
// -> [5, 6, 1, 20]

[3, 5, 6, 1, 20].without( 20, 6)
// -> [3, 5, 1]
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。