2017-02-10 79 views
2

我有一個使用簡單數組(Array)和類型數組(TypedArray)的應用程序。一次擴展所有Javascript數組

我開發了一些需要的數組類型擴展,如(min,max,sum,...)。

但是,這裏有一個棘手的部分:如何爲JavaScript中的所有數組定義創建的函數?

如果在它們之間有一些繼承層次結構,這個問題會更簡單。但到目前爲止,我沒有找到更大的父母班。

現在我這樣做:

// MIN FUNCTION 
Array    .prototype.min = 
Int8Array   .prototype.min = 
Int16Array   .prototype.min = 
Int32Array   .prototype.min = 
Uint8Array   .prototype.min = 
Uint16Array  .prototype.min = 
Uint32Array  .prototype.min = 
Uint8ClampedArray .prototype.min = 
Float32Array  .prototype.min = 
Float64Array  .prototype.min = function() { 
    // my code; 
} 

// MAX FUNCTION 
Array    .prototype.max = 
Int8Array   .prototype.max = 
Int16Array   .prototype.max = 
Int32Array   .prototype.max = 
Uint8Array   .prototype.max = 
Uint16Array  .prototype.max = 
Uint32Array  .prototype.max = 
Uint8ClampedArray .prototype.max = 
Float32Array  .prototype.max = 
Float64Array  .prototype.max = function() { 
    // my code; 
} 

// GO ON... 

這是如此無情無義醜惡看,我要撕了我的眼睛。

我該如何改進?有什麼可以連接所有這些類型來使用?

EDITED問題
我怎麼可以這樣寫代碼,而無需編寫明確各類JavaScript數組的?

+0

的TypedArrays不共享原型? _另外:我建議添加'typed-arrays'標記._ – evolutionxbox

+3

爲什麼不使用傳遞數組的函數?例如。運行'Math.max.apply(null,yourArrayOfTypeX);'工作得很好。 – schroffl

+0

製作一個函數,它接收你想要添加的方法和它的名字作爲一個字符串,並且使用這個名字迭代'prototype'對象來爲每個原型分配方法。 – 2017-02-10 17:40:24

回答

3

這似乎工作:

function arMax(){ 
 
    var len = this.length; 
 
    var i; 
 
    var max=-Infinity; 
 
    for(i=0;i<len;i++) 
 
     if(this[i]>max) 
 
      max=this[i]; 
 
    return max; 
 
} 
 
function arMin(){ 
 
    var len = this.length; 
 
    var i; 
 
    var min=+Infinity; 
 
    for(i=0;i<len;i++) 
 
     if(this[i]<min) 
 
      min=this[i]; 
 
    return min; 
 
} 
 
for(tp of [ 
 
    Array, 
 
    Int8Array, 
 
    Int16Array, 
 
    Int32Array, 
 
    Uint8Array, 
 
    Uint16Array, 
 
    Uint32Array, 
 
    Uint8ClampedArray, 
 
    Float32Array, 
 
    Float64Array, 
 
]){ 
 
    tp.prototype.max = arMax; 
 
    tp.prototype.min = arMin; 
 
} 
 

 
console.log([ 2, 34, 3, 2, -43, -1 ].max()) 
 
console.log([ 2, 34, 3, 2, -43, -1 ].min())

+1

這是一個很好的答案+1,提高了很多,但沒有解決'明確編寫所有類型'部分。 –

+0

@JonnyPiazzi只有少數這些類型。輸入它們不應該是一個大問題。你通常在較低級別(C,C++)做這種事情。在Object.prototype上拍攝函數的作品,但我想這有點太過分了。我會輸入它並繼續前進(除非出現更好的答案)。 – PSkocik

0

如果你想給我們這個瀏覽器,那麼你就可以從窗口對象本身可用陣列的列表。

var availableAr = []; 
 
Object.getOwnPropertyNames(window).forEach(function(name){ \t 
 
\t if(name.toString().indexOf('Array')!== -1){ 
 
     \t availableAr.push(name.toString()) 
 
    } 
 
}) 
 
console.log(availableAr); 
 
console.log( 
 
     new window[ availableAr[0] ]() 
 
);