2017-02-10 5 views
2

私は単純な配列(配列)と型付き配列(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 QUESTION
はどのように私は明示的にjavascript配列のすべてのタイプを記述することなく、このコードを書くことができますか?

+0

TypedArraysはプロトタイプを共有しませんか? _Also: 'typed-array'タグを追加することをお勧めします。 – evolutionxbox

+3

配列を渡す関数を使用してみませんか?例えば。 'Math.max.apply(null、yourArrayOfTypeX);'を実行してもうまく動作します。 – schroffl

+0

追加するメソッドとその名前を文字列として受け取る関数を作成し、その名前を使って各プロトタイプにメソッドを割り当てる 'prototype'オブジェクトを反復します。 –

答えて

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] ]() 
 
);

関連する問題