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

3
我有一个字典(键为整数,值为浮点数)。现在我想询问该字典中大于给定数字但小于下一个更大键的键的值。
例如:
dict = {100: 0.0035, 150: 0.0024, 200: 0.0019}。
如果我给出122,它应该给我0.0035
如果我给出333,它应该给我0.0019
如果我给出200,它应该给我0.0024
谢谢!

在你的例子中,200大于关键字150但不小于关键字200,那么应该检索哪个值作为200? - Russ Cam
如果我输入数字200,结果应该是0.0024,当我输入数字201时,结果应该是0.0019。 - Roland
6个回答

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);

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]

你可以试试这个。如果有什么问题,抱歉我没有测试的机会。

通过 var key : dict,你可能是想说 var key in dict ... 除此之外,它应该可以解决问题。 - Miguel Ventura
不起作用:输出122>0.0035,333>0.0019,200>0.0019。请注意abs应为Math.abs。 - user180100

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>

通过 $(this).html(id + ": " + s(id)); 你可能是想表达 $(this).html(id + ": " + r(id)); - Roland

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);

0

二分查找,使用修改后的(稳定)算法,搜索满足比较条件的最小元素。


-1
如果你的字典不是很大,你可以尝试从(122-1)开始循环。如果它未定义,则减去1并再次尝试,直到找到为止 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接