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。これらのスパン変数のどれに結果が最も近いかを関数でチェックしたいと思います。たとえば、41.666667 よりも 50 に近いので48.5586返されます。"span6"

これをどこから始めればよいか本当にわかりません。何かアイデアはありますか?

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

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 に答える
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 に答える