如何将输入值与对象文本中的引用值进行比较

How to I compare an input value to reference values in an object literal?

本文关键字:引用 比较 对象 输入 文本      更新时间:2023-09-26

我想将用户输入值与对象文本中排列的一组值进行比较。用户将输入两个值,一个引用变量wk和一个number。这些需要在对象文字中交叉引用,但我似乎无法弄清楚这样做的逻辑?

对象文本构造如下:

var reference = {
   wk31: {
        _90th: '758',
        _75th: '683',
        _50th: '600',
        _25th: '516',
        _10th: '441'
    },
    wk32: {
        _90th: '815',
        _75th: '734',
        _50th: '644',
        _25th: '554',
        _10th: '472'
    },
    wk33: {
        _90th: '870',
        _75th: '783',
        _50th: '687',
        _25th: '590',
        _10th: '503'
    }
}

例如,如果 wk = 32 & number = 755 ,那么我想让用户意识到他们的number is between the 75th and 90th percentile for that wk value

任何帮助,不胜感激。谢谢。

从这里和这里写的内容来看,您似乎不能依赖 Object.keys() 返回的数组的顺序以及 for ... in 循环枚举对象属性的顺序。

相反,将数据重新排列为更有用的内容。

首先,使用以下方法获取 wk 值的正确对象:

var wkObj = reference['wk' + wk];

然后使用以下方法重新排列这些值:

var percentiles = $.map(wkObj, function(value, key) {
    return { number: Number(value), percentile: key.substr(1) };
}).sort(function(a, b) { return a.number - b.number; });

这将创建一个对象数组,其中每个对象有两个属性:(1) number ,这是一个数字,(2) percentile ,这是一个字符串。数组按number值升序排序。

例如,对于wk = 32percentiles数组如下所示:

[
    { number: 472, percentile: '10th' },
    { number: 554, percentile: '25th' },
    { number: 644, percentile: '50th' },
    { number: 734, percentile: '75th' },
    { number: 815, percentile: '90th' }
]

现在,number值是数字,而不是字符串,您可以按所需的顺序安全地遍历数组。

var upperIndex = -1;
$.each(percentiles, function(i, obj) {
    if (obj.number > number) {
        upperIndex = i;
        return false;
    }
});

这是一个 jsfiddle,显示了上面使用的代码。

	var reference = {
	   wk31: {
			_90th: '758',
			_75th: '683',
			_50th: '600',
			_25th: '516',
			_10th: '441'
		},
		wk32: {
			_90th: '815',
			_75th: '734',
			_50th: '644',
			_25th: '554',
			_10th: '472'
		},
		wk33: {
			_90th: '870',
			_75th: '783',
			_50th: '687',
			_25th: '590',
			_10th: '503'
		}
	}
	function checkReference()
	{
		var input = "wk" + document.querySelector("#week_input").value;
		var perc = document.querySelector("#numberInput").value;
		
		var obj = reference[input];
		var keys = Object.keys(obj);
		
		var string = "";
		for (var i = 0; i < keys.length; i++)
		{
			if (perc > obj[keys[i]])
			{
				if (i == 0)
				{
					string = "number higher than 90th percentile for that wk value.";
					break;
				}
				else
				{
					string = "number is between "+keys[i].substr(1)+" and "+ keys[i-1].substr(1) +" percentile for that wk value.";
					break;
				}
			}
			else if (perc < obj[keys[i]] && i == keys.length-1)
			{
				string = "number lower than 10th percentile for that wk value.";
			}
		}
		
		alert(string);
	}
	document.querySelector("#doCheck").addEventListener("click", checkReference, false);
<input id="week_input" type="range" min="31" max="33">
<input id="numberInput" type="range" min="0" max="1000"><br />
<button id="doCheck">Check</button>

像这样:

用户将值滑动到位。代码检查对象并返回值。滑块用于大大减少用户输入错误。

HTML

<div id="result"></div>

.JS

var reference = {
   wk31: {
        _90th: '758',
        _75th: '683',
        _50th: '600',
        _25th: '516',
        _10th: '441'
    },
    wk32: {
        _90th: '815',
        _75th: '734',
        _50th: '644',
        _25th: '554',
        _10th: '472'
    },
    wk33: {
        _90th: '870',
        _75th: '783',
        _50th: '687',
        _25th: '590',
        _10th: '503'
    }
}
var result = $("#result");
//wk value
var bracket = 32;
//value to factor into percentile
var value = 740;
var percentileResult = "";
for (var i in reference) {
    if (reference.hasOwnProperty(i) && i.indexOf("wk" + bracket) !== -1) {
        var ref = reference[i];
        for (var j in ref) {
            if (ref.hasOwnProperty(j)) {
                var percentileValue = ref[j];
                if (percentileValue < value) {
                    percentileResult = j;
                    break;
                }
            }
        }    
    }
};
result.html(value + " is in the " + percentileResult.replace("_", "") + " percentile of wk" + bracket);

小提琴:http://jsfiddle.net/7avjhvsy/

如果可能有 wk 值(如 wk31 和 wk311),请考虑分别在循环之前和第一个循环的 if 语句内添加以下代码片段。 在这种情况下,第二个条件的计算结果将为 true 并选取一个不正确的值:

regex = new RegExp("wk(/'d{" + bracket.toString().length + "})", "g");
if (reference.hasOwnProperty(i) && i.indexOf("wk" + bracket) !== -1 && regex.test(i)) {

Javascript

        function findUpperPercentile(wk, number, reference){    
              var upperPercentile = "_100th"; 
              var wkArray = reference['wk'+wk];
              for (var i in wkArray ){
                  if (wkArray[i]>number){
                      upperPercentile=i
                  }
              } 
              return upperPercentile;
         }