遍历对象或数组以确定元素是否适合范围

时间:2017-04-24 18:51:39

标签: javascript angularjs arrays object

我正在为项目数组构建装饰器,如果对象数组适合那么对象数组将被插入到定义的值范围内。

目前,我正在使用一些条件来检查范围,但代码对我来说感觉不够干净。

有没有人对如何以更简洁和可扩展的方式编写此代码有任何建议?

当前设置示例......

thingsToSort.forEach(function(thing) {
    if (thing > 1 || thing < 3) {
        // set the item to 1
    }
    if (thing > 3 || thing < 5) {
        // set to 3
    }
})

注意:我真的在寻找一种更好的方法来循环这个逻辑并确定对象是否落在范围内。

2 个答案:

答案 0 :(得分:2)

另一种实施方式。

  1. 创建了一个表示范围的函数Range
  2. 识别范围并采取适当措施的功能。 setcompareRange
  3. 请注意函数somecompareRange方法的用法。由于只能在一个范围内找到一个数字,因此不会评估所有范围,直到完成匹配的范围遍历。

    &#13;
    &#13;
    function Range(min, max){
        this.min = min;
        this.max = max;
    }
    
    var rangeArray = [ new Range(1,3), new Range(3,5)];
    
    function compareRange(c,i,arr){
        var result = rangeArray.some(x=> {
            return setcompareRange(c, x.min, x.max)
        });
    }
    
    function setcompareRange(thing, min, max){
        if (thing > min && thing < max) {
            // set the item to 1
            console.log("set thing = " + thing + " in range = " + min);
            return true;
        }
    }
    
    var thingsToSort = [2,4];
    thingsToSort.forEach(compareRange);
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

我会先仔细检查你的逻辑......

thingsToSort.forEach(function(thing) {

此条件会将ANYTHING设置为大于1到1,并忽略第二个条件(thing < 3):

    if (thing > 1 || thing < 3) {
        // set the item to 1
    }

您应该使用&&运算符来AND这两个条件:

    if (thing > 1 && thing < 3) {
        // set the item to 1
    }

同样适用于这个条件,它将ANYTHING设置为大于3到3。

    if (thing > 3 || thing < 5) {  //should be &&
        // set to 3
    }
})

在满足条件后你也没有打破循环。这意味着即使您已经确定某件事符合第一个条件,您仍然要检查它是否符合其他条件。这浪费了资源。使用else if来阻止这种情况:

    if (thing > 1 && thing < 3) {
        // set the item to 1
    }
    else if (thing > 3 && thing < 5) {
        // set to 3
    }

除此之外,它已经很干净了。这与经典fizzbuzz问题非常相似,其中有许多可能的重构