2013-04-25 29 views
2

我有一個用戶輸入的數字X.以及JSON格式的數據列表。獲取JSON數據,其中值最接近數字X

**114** 80 145  175  240  320 
**123** 85 155  190  260  345 
**132** 90 170  205  280  370 

我想將X與第一列中的最接近的數字匹配,然後在該行中返回以下值。

不知道我是否以最好的方式格式化了JSON。但這裏是我到目前爲止有:http://jsfiddle.net/wuSux/

+1

你如何定義最近?我建議你查看lodash.com或underscore.org庫。他們有很多方法來排序,分組和查找值。 – lucuma 2013-04-25 19:36:50

+0

是否有可能讓JSON數據按第一列的值進行預先排序?這將使您能夠進行二進制搜索,這將是最有效的。 – 2013-04-25 19:36:51

回答

2

嘗試這樣:

var data = [{"Body Weight":114," Untrained": 80," Novice": 145," Intermediate": 175," Advanced": 240," Elite": 320}, 
      {"Body Weight":123," Untrained": 85," Novice": 155," Intermediate": 190," Advanced": 260," Elite": 345}, 
      {"Body Weight":132," Untrained": 90," Novice": 170," Intermediate": 205," Advanced": 280," Elite": 370}]; 

var x = 140, 
    difference = 0, 
    bestIndex = 0, 
    bestDifference = Infinity, 
    i, cur, bodyWeight; 

for (i = 0; i < data.length; i++) { 
    cur = data[i]; 
    bodyWeight = cur["Body Weight"]; 
    difference = Math.abs(x - bodyWeight); 
    if (difference < bestDifference) { 
     bestDifference = difference; 
     bestIndex = i; 
    } 
} 

console.log(data[bestIndex]); 

DEMO:http://jsfiddle.net/wuSux/2/

變化x值找到最接近號碼。

+0

優秀,正是我想要的。謝謝伊恩。 – Chris 2013-04-25 20:03:18

+0

有沒有什麼辦法可以從'data [bestIndex]'請求'Untrained','Novice'等值? – Chris 2013-04-25 20:25:07

+0

@Chris絕對!只需使用[數據[bestIndex] .Untrained'或'data [bestIndex] .Novice'等。 – Ian 2013-04-25 20:34:05

2

更改您的數據,所以最後Body Weight320代替"320+",則:

function getClosest(x) { 
    for (var i = data.length - 1; i > -1; i--) { 
     if (x > data[i]["Body Weight"]) break 
    } 
    if (i === data.length - 1) return data[i]; 
    if (i === -1) return data[0]; 

    return data[i + +(x > ((data[i]["Body Weight"] + data[i + 1]["Body Weight"])/2))]; 
} 

DEMO:http://jsfiddle.net/s8Xge/


或者如果你喜歡:

function getClosest(x) { 
    for (var i = data.length - 1; i > -1; i--) { 
     if (x > data[i]["Body Weight"]) break 
    } 
    return i === data.length - 1          ? data[i] : 
      i === -1             ? data[0] : 
      (data[i]["Body Weight"] + data[i + 1]["Body Weight"])/2 ? data[i + 1] : 
                     data[i]; 
} 
+0

謝謝yowza。這可以幫助我獲得最接近的「體重」,但是我也接受其他的價值。 (對不起,如果我不清楚) – Chris 2013-04-25 20:04:14

+0

@Chris:這將返回整個對象。我只是抓住了「體重」屬性以顯示在警報中。 – yowza 2013-04-25 20:30:09