6

我有这个数字范围:

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

4

6 回答 6

3

为了获得确定性的输出,我希望有一个按相关类别排序的数组:

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!");
}
于 2012-08-27T15:46:13.927 回答
2
function returnSize(number, sizeMap) {
    for (var key in sizeMap) {
       if (number < sizeMap[key]) return key;
    }
    return key;
}
于 2012-08-27T15:34:49.427 回答
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
}
于 2012-08-27T15:35:17.653 回答
0

您应该使用一系列选项。由 DESC 订购。

如果您需要遵守上限,请根据您的拳头号码(最大)测试您的号码。

而当你的编号低于或等于某个类别上限时,你就知道他属于哪个类别了。

于 2012-08-27T15:40:58.383 回答
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/

于 2012-08-27T15:43:32.407 回答
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];};
于 2012-08-27T16:15:53.563 回答