【问题标题】:Determine the bucket to which a number belongs to确定一个数字所属的桶
【发布时间】:2017-01-24 05:35:30
【问题描述】:

你如何确定一个数字所属的桶?例如,假设我们有 0 - 20、21 - 50、51 - 80、81 - 100 或“差”、“一般”、“好”、“好”等等效等级。有没有一种有效的方法使用 jquery/lodash/d3/underscore 来找出“45”属于“21 - 50”桶还是“平均”?

编辑:这是最好的方法吗?在速度方面,最少的代码。

这是我在很多帮助下所得到的;

// Set up your data
var range = [[0, 20], [21, 50], [51, 80], [81, 100]]
var number = 45

range.find(function(val) { return val[1] >= number })
// Returns [21, 50]

range.findIndex(function(val) { return val[1] >= number })
// Returns 1

【问题讨论】:

  • 那么问题是什么?请明确您的问题
  • 你需要桶和等级吗,因为你已经可以做桶或等级了
  • 我只是想知道是否有“一种有效/更好的方法”来做到这一点。
  • @richie “我想知道是否有'一种有效/更好的方法'来做到这一点” 你所说的“高效”和“更好”是什么意思?
  • 关于准备将其标记为偏离主题/外部资源,或偏离主题/基于意见

标签: javascript jquery d3.js underscore.js lodash


【解决方案1】:

这应该可以...

var range = [[0, 20], [21, 50], [51, 80], [81, 100]]
var number = 45
var bucket = range.filter(function(a) {
  if (number >= a[0] && number <= a[1]) return a
})

console.log(bucket[0])

【讨论】:

  • 这不会告诉你桶在哪个位置:D
  • 要求是返回bucket而不是位置。
  • 实际上要求是确定范围(21-50)“或”等级(平均)......我想知道他的意思是AND,因为他知道如何做OR
  • 是的。所以,我有一个返回桶而不是索引的答案
  • @PraneshRavi 他显然在问题中做了 OR -
【解决方案2】:

您可以使用属性设置为从"Poor""Great" 的对象数组,对应于设置为属性值的数字范围Array.prototype.filter()

var range = [{
  Poor: [0, 20]
}, {
  Average: [21, 50]
}, {
  Good: [51, 80]
}, {
  Great: [81, 100]
}];

var number = 45;

var res = range.filter(function(el) {
  var key = el[Object.keys(el)];
  return number > key[0] && number < key[1]
});

console.log(Object.keys(res[0])[0])

【讨论】:

  • 整洁 - 我没想过要更改输入范围数据
  • 无缘无故“否决”的目的是什么?如何改进答案?
【解决方案3】:

D3 方式使用音阶:

var scale = d3.scaleQuantize()
  .domain([0,100])
  .range(["very bad","bad","average","good","very good"]);

console.log(scale(34));
console.log(scale(55));
console.log(scale(91));
&lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt;

D3 的好处是比例尺会根据范围值的数量自动划分域。例如,上面的 sn-p 有 5 个值(“非常差”、“差”、“平均”、“好”、“非常好”),因此 34 是“差”。在下面的 sn-p 中,仅使用 3 个值,34 是“平均值”:

var scale = d3.scaleQuantize()
  .domain([0,100])
  .range(["bad","average","good"]);

console.log(scale(34));
console.log(scale(55));
console.log(scale(91));
&lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt;

【讨论】:

    【解决方案4】:
    var ranges = [
        {
            name: 'Poor',
            range: [0, 20]
        },
        {
            name: 'Average',
            range: [21, 50]
        },
        {
            name: 'Good',
            range: [51, 80]
        },
        {
            name: 'Great',
            range: [81, 100]
        },
    ]
    var number = 45;
    var range = _.find(ranges, function (r) {
        return _.inRange(number, r.range[0], r.range[1] + 1);
    }).name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-08
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多