微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-如何编写茉莉花的自定义匹配器以查找对象属性是否在对象属性值的范围内?

我正在尝试为Jasmine实现自定义匹配器,我想在其中检查给定的对象属性值是否在其他两个对象属性值的范围内.

这是到目前为止我得到的:

let matcher = {
            toLieWithin: function (util: jasmine.MatchersUtil, customEqualityTesters: Array<jasmine.CustomEqualityTester>): jasmine.CustomMatcher {
                return {
                    compare: function (actual: any, expected: any): jasmine.CustomMatcherResult {
                        let result: jasmine.CustomMatcherResult = {
                            pass: false,
                            message: ''
                        };

                        result.pass = liesWithin(actual, expected);

                        return result;
                    }
                }
            }
        }; 

function liesWithin<T>(objActual: T, objExpected: T[]): boolean {
        let output: boolean;
        if(objExpected) {
          output = objActual.x > objExpected[0].x && objActual.x < objExpected[1].x && objActual.y > objExpected[0].y && objExpected[1].y;
        }
return output;    
}

我假设在这里,实际值具有两个属性x和y.期望的是两个对象组成的数组,每个对象还具有两个属性x和y.

actual = {x: -5, y: -10}; expected = [{x: -10, y: -17},{x: 0, y: 0}];

现在,对于上面给出的简单示例,我相信这种情况是可行的.但是,当我尝试将其实现为泛型时,如何找到对象具有的属性?我的方法正确吗?谁能给我一些想法,我如何实现这种方法.

谢谢.

解决方法:

看起来您的liesWithin函数处在正确的轨道上,您只需要考虑预期对象可能无法按预期返回的情况.此代码也应涵盖以下情况:

// Helper to reduce repeated code
function isWithinRange(val, a, b) {
    return (val > a && val < b) || (val > b && val < a);
}

function liesWithin<T>(objActual: T, objExpected: T[]): boolean {
    if (objExpected) {
        let props = Object.keys(objActual);
        // Splitting X and Y checks into two for readability
        let isInYRange = isWithinRange( objActual[ props[0] ], objExpected[0][ props[0] ], objExpected[1][ props[0] ] );
        let isInxrange = isWithinRange( objActual[ props[1] ], objExpected[0][ props[1] ], objExpected[1][ props[1] ] );
        return isInxrange && isInYRange;
    }
    return;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐