3

配列内の変数をチェックしたいと思います。数値が私の値と直接一致する場合に機能します。一致を下回っている場合、前の値と一致させるにはどうすればよいですか。私のコードから:

var assassin_bp = {
    fhr: { 7:8, 15:7, 27:6, 48:5, 86:4, 200:3 },
    fcr: { 8:15, 16:14, 27:13, 42:12, 65:11, 102:10, 174:9 }
}
var char_fhr = 48;
var fhr_frames = assassin_bp[ 'fhr' ][ [char_fhr] ]

char_fhr48の 場合、fhr_framesは5を返します。char_fhr47 (または 27 から 47 の任意の数) の 場合、 fhr_framesは6を返します。char_fhr49 (または 48 から 85 の任意の数) の場合、fhr_framesは5を返します。

どこから始めればよいかわかりません。オブジェクトに範囲を含めることはできますか? 関数をチェックする必要がありますか?

4

2 に答える 2

2

オブジェクトのプロパティを繰り返し処理し、それらの名前をターゲット値と比較する必要があります。for...in [MDN]およびオブジェクトの操作[MDN ] を参照してください。

function valueForClosestKey(obj, target) {
    // get all keys smaller than or equal to `target`
    var keys = [];
    for(var k in obj) {
        if(k <= target) {
            keys.push(k);
        }
    }

    // order keys in ascending order
    keys.sort(function(a, b) {
        return a - b;
    }); 
    // e.g. `keys` is now [7, 15, 27, 48]      

    // get the "closest" key, which is the last one in the array
    if(keys.length > 0) {
        return obj[keys.pop()];
    }
    // if there are no keys smaller than `target` (i.e. `keys` is empty),
    // we just don't return anything (implicitly returns `undefined`)
}

var value = valueForClosestKey(assassin_bp[ 'fhr' ], char_fhr);

オブジェクトが繰り返される順序は実装に依存するため、この方法でキーを抽出してソートする必要があります。つまり、プロパティが正しい番号順であることは保証されません。

于 2012-10-09T18:07:35.857 に答える
1

http://jsfiddle.net/aquinas/QP6aF/

どうですか:

var assassin_bp = {
    fhr: { 7:8, 15:7, 27:6, 48:5, 86:4, 200:3 },
    fcr: { 8:15, 16:14, 27:13, 42:12, 65:11, 102:10, 174:9 }
}

var arr = [];

for (var prop in assassin_bp.fhr){
    if (assassin_bp.fhr.hasOwnProperty(prop)){
        arr.push(parseInt(prop));
    }
}

arr.sort(function(a,b){return a-b;});

function calcScore(val){
    if (arr[0] > val){
        return assassin_bp.fhr[arr[0]];
    }

    for (var i=arr.length; i>=0; i--){
        if (val >= arr[i]){
            return assassin_bp.fhr[arr[i]];
        }
    }
}

//test to see if this works:
for (var i=0; i<300; i++){
    document.write(i + " - " + calcScore(i) + "<br/>");
}                    
        ​
于 2012-10-09T18:58:50.630 に答える