具有多列的数组中最接近的最高值

时间:2018-03-01 16:14:05

标签: javascript jquery arrays math

我想测试一些输入字段中的累积值(var goal),其中数组中最接近最高['size']

因此,我们的目标是找到与size 95最接近的最高值。

var variants = [
          { value: "128428226", size: "50 ", price: 3.72, priceIncl: 4.5 },
          { value: "128428229", size: "100 ", price: 5.5, priceIncl: 6.65 },
          { value: "128428232", size: "150 ", price: 7.27, priceIncl: 8.8 }
    ]

var goal = 95; 
var closest = variants;
var closestPrice = '';
var closestPriceIncl = '';
var closestVal = '';


 $.each(variants, function(){
          if (closest['size'] == null || Math.abs(this['size'] - goal) < Math.abs(closest['size'] - goal)) { 
            closest = this;
            closestPrice = closest['price'];
            closestPriceIncl = closest['priceIncl'];
            closestVal = closest['value']
          }
        });    

我能够得到我想要的所有价值。但是当目标类似于75时,我的脚本会从size: "50"中选择值。所以实际上当目标是51时,它应该选择100等。

我真的找不到办法做到这一点。我找到了一些使用函数的其他答案,但后来我没有得到如何获得其他值。 (我只需要找到最接近的最高值。) 任何帮助非常感谢。

3 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,以下代码就足够了:

base_class

两个定义谓词是最接近的变体的大小大于目标,并且大小之间的差异应该是最小的。

答案 1 :(得分:0)

试试这个。我想这一定是你要做的。

&#13;
&#13;
var variants = [
          { value: "128428226", size: "50 ", price: 3.72, priceIncl: 4.5 },
          { value: "128428229", size: "100 ", price: 5.5, priceIncl: 6.65 },
          { value: "128428232", size: "150 ", price: 7.27, priceIncl: 8.8 }
    ];

var arr = Object.keys(variants).map(function(k) { return parseInt(variants[k]['size']) });

function closest(array,num){
    var i=0;
    var minDiff=1000;
    var ans;
    for(i in array){
         var m=Math.abs(num-array[i]);
         if(m<minDiff){ 
                minDiff=m; 
                ans=array[i]; 
            }
      }
    return ans;
}

console.log(closest(arr,75))
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以使用elemnt的绝对delta和之前的stire临时结果,如果更小,则推送一个新数组,否则检查delta是否相同,然后将实际项目推送到结果集。

结果返回一个包含最近项的数组。

也许这是一个好主意,可以清除数据附加值空间,例如size: "50 "

&#13;
&#13;
var variants = [{ value: "128428226", size: "50", price: 3.72, priceIncl: 4.5 }, { value: "128428229", size: "100", price: 5.5, priceIncl: 6.65 }, { value: "128428232", size: "150", price: 7.27, priceIncl: 8.8 }],
    goal = 95,
    closest = variants.reduce(function (r, o) {
        if (!r || Math.abs(o.size - goal) < Math.abs(r[0].size - goal)) {
            return [o];
        }
        if (Math.abs(o.size - goal) === Math.abs(r[0].size - goal)) {
            return r.push(o);
        }
        return r;
    }, undefined);
    
console.log(closest);
&#13;
&#13;
&#13;