如何创建一个确定2个数字之间的值的函数

时间:2012-08-27 15:30:33

标签: javascript object

我有这个数字范围:

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)。我应该将对象呈现为数组吗?

6 个答案:

答案 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];};