代码之家  ›  专栏  ›  技术社区  ›  E. Williams

Javascript属性检查器函数(使用闭包)

  •  1
  • E. Williams  · 技术社区  · 7 年前

    我正在尝试编写一个函数,可以用来检查对象的属性。

    例如,对于给定对象:

    var obj = {
        s : 'a',
        n : 1,
        d : new Date(),
        f : function(){},
        a : [],
        o : {
            a : {
                b: 'b'
            }
        }
    };
    

    我可以使用我的inspector函数访问属性:

    var ins = inspector(obj);
    ins('s') // -> a
    ins('n') // -> 1
    ins('d') // -> 2018-12-06T11:51:26.244Z
    ins('f') // -> [Function]
    ins('a') // -> []
    ins('o') // -> { a: { b: 'b' } }
    ins('o.a') // -> { b: 'b' }
    ins('o.a.b') // -> b
    ins('o.p') // -> undefined
    ins('o.p.p') // -> undefined
    ins('p') // -> undefined
    ins('') // -> undefined
    

    function inspector(obj){
        return function fun (prop){
            console.log(obj[prop])
        }
    }
    

    但是,它在某些情况下不能正常工作:

    ins('o.a') // -> { b: 'b' }
    ins('o.a.b') // -> b
    ins('o.p') // -> undefined
    ins('o.p.p') // -> undefined
    

    如何重写函数以适应这些情况?

    1 回复  |  直到 7 年前
        1
  •  5
  •   ibrahim mahrir    7 年前

    你可以用 reduce 以获取值。首先,您需要将路径拆分为 . :

    function inspector(obj){
        return function fun (prop){
            return prop.split(".").reduce(function(o, p) {  // for each part p in prop.split(".")
                return o && o[p];                           // if o is an object truthy return o[p]
            }, obj);                                        // pass obj as the initial o
        }
    }
    

    o && 这是非常基本的。如果你想下标 o 当且仅当 o 是一个对象,然后将该行替换为:

    return (o && typeof o === "object")? o[p]: undefined;
    

    返回 o[p] o 是一个对象,否则 undefined .

    function inspector(obj){
        return function fun (prop){
            return prop.split(".").reduce(function(o, p) {
                return (o && typeof o === "object")? o[p]: undefined;
            }, obj);
        }
    }
    
    var obj = {
        s : 'a',
        n : 1,
        d : new Date(),
        f : function(){},
        a : [],
        o : {
            a : {
                b: 'b'
            }
        }
    };
    
    var ins = inspector(obj);
    
    console.log('s:', ins('s'));          // -> a
    console.log('n:', ins('n'));          // -> 1
    console.log('d:', ins('d'));          // -> 2018-12-06T11:51:26.244Z
    console.log('f:', ins('f'));          // -> [Function]
    console.log('a:', ins('a'));          // -> []
    console.log('o:', ins('o'));          // -> { a: { b: 'b' } }
    console.log('o.a:', ins('o.a'));      // -> { b: 'b' }
    console.log('o.a.b:', ins('o.a.b'));  // -> b
    console.log('o.p:', ins('o.p'));      // -> undefined
    console.log('o.p.p:', ins('o.p.p'));  // -> undefined
    console.log('p:', ins('p'));          // -> undefined
    console.log(':', ins(''));            // -> undefined