2013-05-15 63 views
3

我在Javascript中的3個數組,數組中的值是產品編號=>價格(XX:XX)價格最接近陣列?

var instantPriser = {11: 48,12: 96,13: 144,14: 192,15: 240,16: 288,17: 336,18: 384,19: 432,20: 480,21: 528,22: 576,23: 624,24: 672,25: 720,26: 768,9999999999999999}; 
var maletPriser = {27: 20,28: 40,29: 60,30: 80,31: 100,32: 120,33: 140,34: 160,35: 180,36: 200,37: 220,38: 240,39: 260,40: 280,41: 300,42: 320,43: 340,44: 360,45: 380,46: 400,47: 420,48: 440,49: 460,50: 480,51: 500,52: 520,53: 540,54: 560,55: 580,56: 600,57: 620,58: 640,59: 660,60: 680,61: 700,62: 720,63: 740,64: 760,65: 780,66: 800,67: 820,68: 840,69: 860,70: 880,71: 900,9999999999999999}; 
var heleBoenner = {72: 89,73: 178,74: 267,75: 356,76: 445,77: 534,78: 623,79: 712,80: 801,81: 890,82: 979,83: 1068,84: 1157,85: 1246,86: 1335,87: 1424,88: 1513,89: 1602,90: 1691,91: 1780,92: 1869,93: 1958,94: 2047,95: 2136,9999999999999999}; 

我想看看我怎麼可以從陣列由獲得最接近「的productId」我價錢?

我已經試過這一點,但似乎並沒有工作非常好:

var price = 450; 
for (i=0;i<instantPriser.length;i++){ 
     if (pris <= instantPriser[i]){ 
      alert(instantPriser[i]); 
      return false; 
     } 
} 

它應該像19或20的輸出,因爲該值是432和480(最接近450)

我該怎麼做?

+3

首先,他們是3個對象,而不是3一陽指。其次你值不能有逗號,除非它們是字符串 –

+0

但這些不是數組。 – SomeShinyObject

回答

1

推送所有的值到一個數組,然後找到使用下面的代碼

var closest = null; 

    $.each(arr, function(index,value1){ 
     if (closest == null || Math.abs(value1 - value) < Math.abs(closest - value)) { 
     closest = this.value; 
     } 
    }); 
    alert(closest); 

LINK

+0

確定警報(最接近)它說「對象窗口」。 ? –

+0

我想嘗試打印closest.value – PSR

+0

請看這裏http://jsfiddle.net/qfQyb/它正在正常工作 – PSR

0

沒有任何圖書館最接近的值,你可以做這樣的

findClosest=function (obj,price) { 
    var pid; 
    var min = 100000 
    for(i in obj) { 
     if(obj.hasOwnProperty(i) { 
      var diff = Math.abs(price - obj[i]); 
      if(min >= diff) { 
       min = diff 
       pid = i; 
      } 
     } 
    } 
    console.log(pid); // replace it with return or alert 
         // or whatever your logic is 
} 

使用

findClosest(instantPricer,450) 
0

在功能的風格:

var target = 450; 
Object.keys(instantPriser).reduce(function(best, x) { 
    return Math.abs(instantPriser[best] - target) <= Math.abs(instantPriser[x] - target) 
     ? best : x; 
}) 

或用一個輔助函數:

​​

,並提供:

var target = 450; 
Object.keys(instantPriser).min(function(x) { 
    return Math.abs(instantPriser[key] - target); 
})