确定数字所属的存储桶

时间:2016-09-16 04:43:37

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

如何确定数字所属的存储桶?对于前者,我们可以说我们有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

4 个答案:

答案 0 :(得分:3)

这应该有用......

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])

答案 1 :(得分:1)

您可以使用属性设置为"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])

答案 2 :(得分:1)

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));
<script src="https://d3js.org/d3.v4.min.js"></script>

D3的优点在于,比例会根据范围的值数自动划分域。例如,上面的代码段有5个值(“非常差”,“差”,“平均”,“好”,“非常好”),因此34是“坏”。在下面的代码段中,仅使用3个值,34为“average”:

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

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

答案 3 :(得分:0)

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;