1

我有 12 个不同的数字存储在变量中,如下所示:

var span1 = 8.333333333;
var span2 = 16.66666667;
var span3 = 25;
var span4 = 33.33333333;
var span5 = 41.66666667;
var span6 = 50;
var span7 = 58.33333333;
var span8 = 66.66666667;
var span9 = 75;
var span10 = 83.33333333;
var span11 = 91.66666667;
var span12 = 100;

我有一个函数,它将 div 的宽度与其父宽度进行比较,并以百分比形式返回一个值(减去 % 符号),例如48.5586. 我希望该函数检查结果最接近哪些跨度变量。例如,48.5586将返回"span6",因为它比 41.666667 更接近 50。

真的不知道从哪里开始,有什么想法吗?

4

5 回答 5

6

由于每个跨度都比前一个跨度多 8 1/3 %,这只是100/12,因此您应该能够使用一个公式来计算出您需要的跨度类。

我制定了以下内容:

function spanClass(percentWidth) {
    return 'span' + Math.round(percentWidth / (100/12));
}

这给出span6了 48.5586。

于 2013-01-23T00:19:42.917 回答
3

通过取输入数字与每个变量值之间差异的绝对值的最小值,可以找到最小的差异。

也就是说,您应该真正使用适当的数据结构,如对象或数组,将这些字符串映射到数字。

于 2013-01-23T00:16:07.213 回答
0

将值放入数组中,然后您可以根据值之间的差异对数组进行排序。最小的差异是数组中的第一个,所以这是最接近的值:

var spans = [
    { span: 1, value: 8.333333333 },
    { span: 2, value: 16.66666667 },
    { span: 3, value: 25 },
    { span: 4, value: 33.33333333 },
    { span: 5, value: 41.66666667 },
    { span: 6, value: 50 },
    { span: 7, value: 58.33333333 },
    { span: 8, value: 66.66666667 },
    { span: 9, value: 75 },
    { span: 10, value: 83.33333333 },
    { span: 11, value: 91.66666667 },
    { span: 12, value: 100 }
];

var value = 48.5586;

spans.sort(function(x, y){
    var a = Math.abs(value - x.value);
    var b = Math.abs(value - y.value);
    return a == b ? 0 : a < b ? -1 : 1;
});

alert(spans[0].span);

演示:http: //jsfiddle.net/Guffa/77Rf9/

于 2013-01-23T00:29:40.830 回答
0

最好有数组。在我的代码中,我还将您的变量转换为数组,然后进行处理。eval 不好,不应该使用

http://codebins.com/bin/4ldqp6b

var span1 = 8.333333333;
var span2 = 16.66666667;
var span3 = 25;
var span4 = 33.33333333;
var span5 = 41.66666667;
var span6 = 50;
var span7 = 58.33333333;
var span8 = 66.66666667;
var span9 = 75;
var span10 = 83.33333333;
var span11 = 91.66666667;
var span12 = 100;

var arr = [];
for (var i = 0; i < 12; i++) {
    eval('arr[' + i + '] = span' + (i + 1));
}


function closestTo(arr, val) {
    var closest = 10000,
        ind = -1,
        diff = 10000; // some random number
    for (var i = 0; i < arr.length; i++) {
        var tmp = Math.abs(val - arr[i]);
        if (diff > tmp) {
            diff = tmp;
            closest = arr[i];
            ind = i;
        }
    }
    alert("Closesnt Number: " + closest + "\nClosest Index:" + ind + "\nclosest variable: span" + (ind + 1))
}

closestTo(arr, 50.12)
于 2013-01-23T00:30:15.853 回答
0

在 JavaScript 中实现最接近的函数。将所有跨度移动到一个对象中,以便更轻松地对其进行迭代。只需枚举所有跨度并保留最接近的跨度。

var spans = {
  span1: 8.333333333,
  span2: 16.66666667,
  span3: 25,
  span4: 33.33333333,
  span5: 41.66666667,
  span6: 50,
  span7: 58.33333333,
  span8: 66.66666667,
  span9: 75,
  span10: 83.33333333,
  span11: 91.66666667,
  span12: 100
};

function closest(value) {
  var delta
    , lastMatch;

  Object.keys(spans).forEach(function (span) {
    var thisDelta;
    if (!delta) {
      lastMatch = span;
      delta = Math.abs(value - spans[span]);
    } else {
      thisDelta = Math.abs(value - spans[span]);
      if (thisDelta < delta) {
        lastMatch = span;
        delta = thisDelta;
      }
    }
  });
  return lastMatch;
}

var result = closest(48.5586);

console.log(result);

这是一个有效的Codepen示例。

于 2013-01-23T00:31:01.797 回答