列表中两个数字之间的JavaScript函数?

时间:2015-06-30 02:55:51

标签: arrays filter underscore.js

我想创建一个函数,它将从以下列表中检索结果

var Fedsy = [
            {min : 0, max : 2300 , must:0, percent:0 , excess:0}, 
            {min : 2300, max : 11525 , must:0, percent:10 , excess:2300},
            {min : 11525, max : 39750 , must:922.50, percent:15 , excess:11525},
            {min : 39750, max : 93050 , must:5156.25, percent:25 , excess:39750},
            {min : 93050, max : 191600 , must:18481.25, percent:28 , excess:93050},
            {min : 191600, max : 413800 , must:46075.25, percent:33 , excess:191600},
            {min : 413800, max : 415500 , must:119401.25, percent:35 , excess:413800},
            {min : 415500, max : 1000000000 , must:119996.25, percent:39.6 , excess:415500}
            ];

现在,如果“inputNum”介于“min”和&之间,我想从上面的列中提取行。 “最大值”

var result= function(inputNum){
///..???
}

例如:如果“inputNum”= 40000,则该函数应返回

{min : 39750, max : 93050 , must:5156.25, percent:25 , excess:39750}

3 个答案:

答案 0 :(得分:1)

由于您标记了underscore.js,我了解您希望使用该库解决问题。

因此,您可以使用函数_.find来查找与条件匹配的第一个值。把它想象成一个过滤器,但只是看看第一个:

function findRange(inputNum) {
    return _.find(Fedsy, function(f) {
      return f.min <= inputNum && f.max >= inputNum;
    });
}

Fedsy(f)中第一个在迭代器函数中返回true的项将是下划线返回的值。

您可以在underscore.js网站上更详细地了解更多参考函数:http://underscorejs.org/

答案 1 :(得分:0)

我做了什么:

我创建了你提到的函数,它使用纯javascript而没有任何库。它遍历Fedsy数组中的每个项目,并查看该值是否在该范围内。如果是这样,它将返回有问题的行。

一旦发现结果没有继续搜索对象,它也会返回。

数据

var Fedsy = [
            {min : 0, max : 2300 , must:0, percent:0 , excess:0}, 
            {min : 2300, max : 11525 , must:0, percent:10 , excess:2300},
            {min : 11525, max : 39750 , must:922.50, percent:15 , excess:11525},
            {min : 39750, max : 93050 , must:5156.25, percent:25 , excess:39750},
            {min : 93050, max : 191600 , must:18481.25, percent:28 , excess:93050},
            {min : 191600, max : 413800 , must:46075.25, percent:33 , excess:191600},
            {min : 413800, max : 415500 , must:119401.25, percent:35 , excess:413800},
            {min : 415500, max : 1000000000 , must:119996.25, percent:39.6 , excess:415500}
            ];

功能

function filterArray(inputNum){
    var row;

    // Foreach item in the array
    for(rownum in Fedsy){ 
        var row = Fedsy[rownum];

        // If "inputNum" is greater than or equal to "row.min" & less than "row.max"
        if(inputNum >= row.min && inputNum < row.max){
            return row;
        }
    }
}

用法

var result = filterArray(3);  // returns first row
console.log(result.must); //0

答案 2 :(得分:0)

如果您只想要第一个匹配的行,那么下划线/ lodash的_.find https://lodash.com/docs#find的应用可能就是您想要的:

var result = (function(inputNum){
    return _.find(Fedsy, function(item){
        return inputNum>item.min && inputNum<item.max;
    });
})();

这将立即运行一个接受inputNum的匿名函数,并在_.find用来检查每个项目的另一个匿名函数中使用它。 _.find的优点是它会在遇到结果时立即停止查看。

理想情况下,你会以更通用的方式编写内容,这样你就可以指定你的过滤器和你分别过滤的内容,所以也许可以这样做:

var minmaxFilterFunc = function(inputNum){
    return function(item){
        return inputNum>item.min && inputNum<item.max;
    };
};

现在,使用minmaxFilterFunc,您可以创建一个为特定inputNum返回true的函数。现在您可以直接使用find,在一行中创建适当的过滤功能。更容易阅读,也更容易重复使用,以便以后过滤不同数字的其他集合。

var result = _.find(Fedsy, minMaxFilterFunc(inputNum));