2017-02-10 90 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] ]() 
 
);