使用JavaScript从字典中获取最接近给定数字的值

时间:2009-10-29 22:10:18

标签: javascript jquery dictionary

我有一个字典(键是整数,值是浮点数)。我现在要求字典中的键的值是>比给定的数字但是<而不是下一个更大的关键。

示例:

dict = {100:0.0035,150:0.0024,200:0.0019}。

我给122,它应该给我0.0035

我给333,它应该给我0.0019

我给200,它应该给我0.0024

谢谢!

6 个答案:

答案 0 :(得分:1)

这是二叉树的完美用例。对于堆栈溢出答案,这个主题有点宽泛,但无论如何都要进行。

function addValueToNode(tree, nodeidx, value) {
    var left = 2*nodeidx + 1;
    var right = 2*nodeidx + 2;

    if(value > tree[nodeidx]) {
        if(!tree[right])
            tree[right] = value;
        else
            addValueToNode(tree, right, value);
    } else {
        if(!tree[left])
            tree[left] = value;
        else
            addValueToNode(tree, left, value);
    }
}

function addValueToTree(tree, value) {
    if(tree.length == 0)
        tree.push(value)
    else
        addValueToNode(tree, 0, value);
}

function addValuesToTree(tree, values) {
    for(var i = 0; i < values.length; i++)
        addValueToTree(tree, values[i]);
}

function addDictionaryToTree(tree, dict) {
    var values = [];
    for(var key in dict) {
        values.push(key);
    }
    values.sort();
    addValuesToTree(tree, values);
}

function findClosestValue(tree, nodeidx, value) {
    var left = 2*nodeidx + 1;
    var right = 2*nodeidx + 2;

    if(value > tree[nodeidx]) {
        if(!tree[right] || tree[right] == value)
            return tree[nodeidx];
        else
            return findClosestValue(tree, right, value);
    } else {
        if(!tree[left])
            return tree[nodeidx];
        else
            return findClosestValue(tree, left, value);
    }
}
var tree = [];
var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};

addDictionaryToTree(tree, dict);

var closest = findClosestValue(tree, 0, 175);
var dictValue = dict[closest];

alert( closest + " : " + dictValue);

答案 1 :(得分:0)

var value = 122;
var min = null;
var minkey = null;
for ( var key : dict ) {
  if (min==null || abs(value-key)<min) {
      min=abs(value-key);
      minkey = key;
  }
}
return dict[minkey]

你可以试试这个。对不起,如果smth,我没有机会测试它。

答案 2 :(得分:0)

工作示例(在Firefox 3.6下测试):

<html>
<head>
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript">
var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};

function r(aNum) {
    var result;

    for (var key in dict) {
        var dist = key - aNum

        if ((dist < 0 && dist < result) || result === undefined) {
            result = key;
        }
    }

    return dict[result];
}

$(document).ready(function() {
    $('li').each(function() {
        var id = $(this).attr('id').replace('n', '')
        $(this).html(id + ": " + r(id));
    });
});
</script>
</head>
<body>
    <ul>
        <li id="n122"></li>
        <li id="n333"></li>
        <li id="n200"></li>
    </ul>
</body>
</html>

答案 3 :(得分:0)

以下功能符合您的要求:

function getNumber(dict, value) {
  var key, found;

  for (key in dict) {
    if (value - key > 0) {
      found = key;
    }
  }
  return dict[found];
}

var dict = {100: 0.0035, 150: 0.0024, 200: 0.0019};

// Firebug assertions
console.assert(getNumber(dict, 122) == 0.0035);
console.assert(getNumber(dict, 333) == 0.0019);
console.assert(getNumber(dict, 200) == 0.0024);

答案 4 :(得分:0)

二进制搜索,使用修改的(稳定)算法搜索满足比较标准的最小元素。

答案 5 :(得分:-1)

如果您的字典不是很大,您可以尝试从(例如)(122-1)循环。如果它未定义,则减去1并再试一次,直到找到一些东西:)