我有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"
,因为它接近50而不是41.666667。
真的不知道从哪一个开始,有什么想法吗?
答案 0 :(得分:6)
由于每个范围比前一个范围(仅100/12
多8 1/3%),您应该能够使用公式计算出您需要的范围类。
我制定了以下内容:
function spanClass(percentWidth) {
return 'span' + Math.round(percentWidth / (100/12));
}
这为48.5586提供span6
。
答案 1 :(得分:3)
通过获取输入数与每个变量值之差的minimum absolute value,可以找到最小的差异。
也就是说,您应该使用适当的数据结构(如对象或数组)将这些字符串映射到数字。
答案 2 :(得分: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);
答案 3 :(得分: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)
答案 4 :(得分: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示例。