2012-10-09 42 views
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_fhr值得,fhr_frames返回,
如果char_fhr是值得(或至47的任何数量从27),fhr_frames应返回,
if if cha r_fhr值得(或任何数量的从48至85),fhr_frames应返回

我在哪里开始无能。对象是否可以包含范围?我应该有一个函数检查它吗?

+1

是否有预见性的范围?你目前的范围似乎是随机的他们是这样的吗? –

+0

... fyi,你在'char_fhr'变量周围有一组额外的'[]'。在这种确切的情况下无害,但应该被删除。 –

+0

为什么你不能只使用for循环来通过数组? – KLee1

回答

2

您需要迭代对象属性并将它们的名称与目标值进行比较。见for...in[MDN]Working with Objects [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); 

这样就需要对键进行提取和排序,因为迭代对象的顺序依赖于实现。即不能保证这些属性的编号顺序是正确的。

+0

我不认为你需要数组转换和排序。该命令受到最终的'for'语句的约束,该语句强制执行数字序列。或者我错过了什么。 –

+0

更改我的代码使其更简单,但无论如何,如果我想按自然顺序遍历键,则需要提取键。没有定义用'for ... in'迭代对象的顺序。 –

+0

但是没有一个对象的自然顺序。我们唯一可以得到的是我们在枚举时执行的顺序。恰巧在问题中,键以数字顺序出现,但如果它们没有,则无法强制执行原始定义。 –

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/>"); 
}      
     ​ 
+0

谢谢!这适用于我,但我试图合并功能,如看到http://jsfiddle.net/veksen/JtrLM我觉得我不太远:/ – veksen

相关问题