我有这个数字范围:
0 -------> 25 -------> 80 ------> 150
small medium large
我想收到0到150之间的数字,并显示它是小,中还是大。 30和45是中等的,因为它们在25到80之间,5是小的,因为它低于25。
我想创建一个为此对象执行此匹配的函数:
var sizeMap = { small : 25, medium : 80, large : 150 }
(假设0是最低的数字)。
该功能应如下所示:
function returnSize(number) {
for (item in sizeMap)
???????
return size
}
如何编写此功能,以便可以灵活添加新类别(例如:'extra large':250)。我应该将对象呈现为数组吗?
答案 0 :(得分:3)
要拥有deterministic output,我更愿意按相关类别排序数组:
var categories = [
{label: 'small', upTo: 25},
{label: 'medium', upTo: 80},
{label: 'large', upTo: 150} ];
(您甚至可以从原始sizeMap
)
然后你可以这样做:
function getSizeCategory(number, categories) {
for (var i = 0; i < categories.length; ++i) {
if (number < categories[i].upTo) {
return categories[i].label;
}
}
throw new Error("not in range!");
}
答案 1 :(得分:2)
function returnSize(number, sizeMap) {
for (var key in sizeMap) {
if (number < sizeMap[key]) return key;
}
return key;
}
答案 2 :(得分:1)
只返回满足“小于”条件的最大值:
function returnSize (number) {
var item;
for (item in sizeMap) {
if (number < sizeMap[item]) {
return item;
}
}
return item; // this will return largest size if it gets this far
}
答案 3 :(得分:0)
你应该使用一系列选项。由DESC下令。
如果您需要遵守上限,则根据您的第一个数字(最大值)测试您的号码。
当你的数字低于或等于类别上限时,你知道他属于哪个类别。
答案 4 :(得分:0)
这里有一个解决方案:
RangeCheck = function(range) {
this.init(range);
};
RangeCheck.prototype = {
constructor: RangeCheck,
/**
* The range map.
*/
range: null,
init: function (range) {
this.range = range || {};
},
putRange: function(name, max) {
this.range[name] = max;
},
check: function(number) {
for (var key in this.range) {
if (this.range.hasOwnProperty(key)) {
if (number <= this.range[key]) {
return key;
}
}
}
return key;
}
};
像这样使用:
var rangeCheck = new RangeCheck({ small : 25, medium : 80, large : 150 });
var message = "15: " + rangeCheck.check(15) + "\n"
+ "25: " + rangeCheck.check(25) + "\n"
+ "85: " + rangeCheck.check(85) + "\n"
+ "850: " + rangeCheck.check(850) + "\n";
alert(message);
rangeCheck.putRange("veryLarge", 300);
var message = "15: " + rangeCheck.check(15) + "\n"
+ "25: " + rangeCheck.check(25) + "\n"
+ "85: " + rangeCheck.check(85) + "\n"
+ "850: " + rangeCheck.check(850) + "\n";
alert(message);
和jsFiddle:http://jsfiddle.net/xKjt7/
答案 5 :(得分:0)
只是为了好玩。一个班轮使用underscore
:
get_size = function (n) { return _.find(_.map({'small':100, 'big':200}, function (x,i) { return [x < n, i]; }), function (x) { return x[0] == false; })[1];};