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

楽しみのためだけに。を使用したワンライナー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 に答える
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 に答える