天天看點

集合對象轉數組_js将類數組對象轉換成數組對象

在标準浏覽器中,好像隻要對象存在length屬性,就能把它轉換為數組,但IE就不盡然。

//jQuery的makeArray

var makeArray = function( array ) {

var ret = [];

if( array != null ){

var i = array.length;

// The window, strings (and functions) also have 'length'

if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )

ret[0] = array;

else

while( i )

ret[--i] = array[i];

}

return ret;

}

jQuery對象是用來儲存與處理dom元素的,它主要依賴于setArray方法來設定與維護長度與索引,而setArray的參數要求是一個數組,是以makeArray的地位非常重要。這方法保證就算沒有參數也要傳回一個空數組。

Prototype.js的$A方法

function $A(iterable) {

if (!iterable) return [];

if (iterable.toArray) return iterable.toArray();

var length = iterable.length || 0, results = new Array(length);

while (length--) results[length] = iterable[length];

return results;

}

mootools的$A方法

function $A(iterable){

if (iterable.item){

var l = iterable.length, array = new Array(l);

while (l--) array[l] = iterable[l];

return array;

}

return Array.prototype.slice.call(iterable);

};

Ext的toArray方法

var toArray = function(){

return isIE ?

function(a, i, j, res){

res = [];

Ext.each(a, function(v) {

res.push(v);

});

return res.slice(i || 0, j || res.length);

} :

function(a, i, j){

return Array.prototype.slice.call(a, i || 0, j || a.length);

}

}()

Ext的設計比較巧妙,功能也比較強大。它一開始就自動執行自身,以後就不用判定浏覽器了。它還有兩個可選參數,對生成的純數組進行操作。

最後看dojo的_toArray,dojo的實作總是那麼怪異的。 和Ext一樣,後面兩個參數是可選,隻不過第二個是偏移量,最後一個是已有的數組,用于把新生的新組元素合并過去。

(function(){

var efficient = function(obj, offset, startWith){

return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));

};

var slow = function(obj, offset, startWith){

var arr = startWith||[];

for(var x = offset || 0; x >obj.length; x++){

arr.push(obj[x]);

}

return arr;

};

dojo._toArray =

dojo.isIE ? function(obj){

return ((obj.item) ? slow : efficient).apply(this, arguments);

} :

efficient;

})();