一次扩展所有Javascript数组

时间:2017-02-10 17:29:42

标签: javascript arrays

我有一个使用简单数组(Array)和类型数组(TypedArray)的应用程序。

我为数组类型开发了一些必要的扩展,如(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...

看起来我想要扯掉眼睛,这太可怕了。

我该如何改进?有什么东西可以连接所有这些类型吗?

已编辑的问题
如何在不明确编写所有类型的javascript数组的情况下编写此代码?

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果您要在浏览器中找到我们,那么您可以从窗口对象本身获取可用数组的列表。

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