AngularJS:在多值对象中找到最接近的值

时间:2015-03-08 22:15:19

标签: javascript arrays angularjs distribution

我正在尝试学习一些AngularJS,创建一个计算分布的“简单”数学工具。

我有一组数字,我设法得到一个唯一值列表,其中包含对象中出现次数和百分比(唯一的数字作为键,出现次数,百分比和渐进百分比作为值)。例如:

$scope.values = {"17" : [1, 0.02, 0.02],"18" : [6, 0.12, 0.14],"19" : [7, 0.14, 0.28],"20" : [9, 0.18, 0.46],"21" : [13, 0.26, 0.72], "22" : [4, 0.08, 0.8],"23" : [5, 0.1, 0.9],"24" : [1, 0.02, 0.92],"25" : [3, 0.06, 0.98],"26" : [1, 0.02, 1]}

唯一编号是关键,而3个值分别是出现次数,总迭代次数和渐进百分比。例如,数字25出现3次,即6%的次数,并且包括98%的小于或等于25的数字。

问题
给定“渐进百分比”,我需要得到最接近该百分比值的关键字。因此,搜索必须仅在第3个值上执行(如果有任何改变),应该识别最接近的值(选择两个等距值中较大的值),应该返回

在上面的示例中:

  • 如果我搜索0.75,我应该得到21,
  • 如果我搜索0.91,我应该得到23。

对此有何帮助?

这是我到目前为止的地方:

function nearest(num, ar) {
        var i = 0,
            closest, closestDiff, currentDiff;
        for (i; i < ar.length; i++) {
            if (closest) {
                closestDiff = Math.abs(num - closest);
                currentDiff = Math.abs(num - ar[i]);
                if (currentDiff < closestDiff) {
                    closest = ar[i];
                }
                closestDiff = null;
                currentDiff = null;
            } else if (!closest) {
                //give initial value
                closest = ar[i];
            }
        }
function (pct) {
    $scope.milestones = [];
    var ms = $scope.getClosestNum(pct, $scope.values);
    $scope.milestones.push(ms);
    return $scope.milestones;
  };

但我的HTML中的{{getMilestones(0.75)}}不会返回任何内容。

4 个答案:

答案 0 :(得分:0)

我认为

    var ms = getClosestNum(0.75,$scope.values);

应该是

    var ms = $scope.getClosestNum(0.75,$scope.values);

你已经在你的$ scope对象上定义了这个函数(这是典型的),所以应该在它上面调用它。

答案 1 :(得分:0)

您有arr作为getClosest函数的参数,但您在代码中引用了ar。我纠正这个时似乎工作(以及在html中设置ng-app =“mcApp”)。

http://jsfiddle.net/edhy6927/9/

答案 2 :(得分:0)

我可能自己找到了解决方案。感谢@pankajparkar,我知道我没有在适当的数组中保存值。从那开始我认为一个对象会更合适。因此,将数字收集在一个更“干净”的对象中,如:

{"34":0.04,"35":0.1,"36":0.12,"37":0.14,"38":0.16,"39":0.18,"40":0.22,"41":0.28,"43":0.36,"44":0.38,"45":0.42,"46":0.48,"47":0.52,"48":0.6,"49":0.64,"50":0.7,"51":0.8,"52":0.88,"53":0.92,"54":0.94,"55":1}

我正在使用一个函数来获得最接近的值,该函数可以识别出比我正在寻找的值更高且更高的两个数字,然后选择最接近的数字:

function findNearest(obj, value) {
    for (var i in obj) {
        if (value > obj[i]) prev = obj[i];
        else if (value <= obj[i]) {
            next = nums[i];
            percentage = (Math.abs(value - prev) < Math.abs(next - value)) ? prev : next;
            nearest = parseInt(Object.keys(obj).filter(function(key) {return obj[key] === percentage})[0]);
            break;
        }
    }
    return nearest;
}

干杯

答案 3 :(得分:-1)

您需要创建一个过滤器,如下所示。

<强>代码

app.filter('calculateThirdPercentile', function() {
    return function(values) {
        var returnValue = {};
        if (angular.isArray(values) && values.length > 0) {
            angular.forEach(values, function(value, index) {
               returnValue[(Math.ceil(value[2]*10)*10)+"%"] = index;
            });
        }
        return returnValue;
    }
});

<强> HTML

results | calculateThirdPercentile

<强>控制器

$filter('calculateThirdPercentile')($scope.results);

希望这可以帮助你,谢谢。