0

私の質問がばかげているか、似たようなものが見つからないために間違ったものを探しています。複数の条件を持つ if ステートメントを動的に作成できるかどうか疑問に思っていました。その場で思いつく唯一の方法は、次のようなものです。

function someTest( numOne, numTwo ) {
for (var i = numOne; i < numTwo; i++) {
   if (someCol[i].test === false) {
    return false;
   }
}
}

someTest( 20, 35 );

これは、複数の if ステートメントを通過し、それらのいずれかが true でない場合は false を返し、&& 複数の && パラメーター && を持つ通常の if ステートメントのように「短絡」するため、私が何を意味するかを示すための単なる例です。しかし、これはテーブルを使用することを強制し、else ステートメントをより複雑にします。どなたかアドバイスや良い方法があれば教えてください。ご意見ありがとうございます

編集:少し複雑ですが、もしあなたが主張するなら:-P. 私は6行あり、それぞれに4列があります。したがって、合計 24 個の「セル」または「ボックス」と呼びます。各ボックスはプラスまたはマイナスできますが、それよりも少しトリッキーです. 2 番目の行にアクセスするには、最初の行に少なくとも 4 つの「ポイント」が必要です。したがって、4 番目の行にアクセスするには、合計で少なくとも 12 ポイントが必要です。

ポイントを追加するのは簡単ですが、ポイントを削除すると複雑になります。最初の 3 列を追加することはできず、12 を超えるポイントがある場合は、4 番目の列の上の列にポイントがある場合に備えて、4 番目の列からポイントを削除できます。たとえば、6 列目にポイントがあるための最小ポイント。これは理にかなっていますか?簡単な jsfiddle を作成して、実行例を示します。いくつかください

EDIT2: http://jsfiddle.net/zBcBd/3/

まだ作業中ですが、ご覧のとおり、最初の行に少なくとも 4 つのポイントがない限り、2 番目の行にポイントを追加することはできません。 8点。これは簡単な部分でした。私が達成しようとしているのは、ポイントを削除することですが、すべてをテストする必要があります。たとえば、6 番目の行にポイントがある場合、6 番目の行をサポートするために 21 を超えるポイントがない限り、5 番目の行からポイントを削除することはできません。

4

1 に答える 1

5

巧妙な構文を行う 1 つの方法は、ブール値を返す関数の配列を持つことです。

function biggerThanThree(){
    return x>3;
}
function smallerThanFive(){
    return x<5;
}

var predicates = [biggerThanThree,smallerThanFive];

//matches all conditions
var valid = predicates.reduce(function(x,y){return x&&y(); },true);
//matches any condition
var somevalid = predicates.reduce(function(x,y){return x||y(); },true);

ここにフィドルがあります

特定のニーズに合わせて、さらに巧妙なことを行い、動的にチェックする関数を生成できます。

var rows = [["+","+","+","-","-","+"],["+","+","+","-","-","+"],["+","+","+","-","-","+"]];
// accepts a row number and asserts that enough elements are in so far
function soFarHasMore(upToRowNum){
    var sum = 0;
    for(var i=0;i<upToRowNum;i++){
        sum+=rows[i].filter(function(x){return x==="+"}).length;
    }
    console.log(sum);
    return sum>=4*upToRowNum;
}

var predicates = [];
// generate functions dynamically and fixate their value of `i`
for(var i=0;i<3;i++){
    predicates.push(soFarHasMore.bind(null,i+1));//pushes predicates dynamically    
}

var valid = predicates.reduce(function(x,y){return x&&y(); },true);//matches all conditions

ここにその動作デモがあります

注: || で reduce を使用しました。&& は reduce が好きだからです。ただし、よりセマンティックなバージョンが利用できると思います。

predicates.every(function(elem){ // Same as &&
    return elem();
};

predicates.some(function(elem){ // Same as ||
    return elem();
};
于 2013-06-19T01:01:21.223 に答える