我正在尝试学习一些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个值上执行(如果有任何改变),应该识别最接近的值(选择两个等距值中较大的值),应该返回键。
在上面的示例中:
对此有何帮助?
这是我到目前为止的地方:
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)}}
不会返回任何内容。
答案 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”)。
答案 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);
希望这可以帮助你,谢谢。