E. *_*ams 1 javascript closures
我正在尝试编写一个可用于检查对象属性的函数.
例如,对于给定的对象:
var obj = {
s : 'a',
n : 1,
d : new Date(),
f : function(){},
a : [],
o : {
a : {
b: 'b'
}
}
};
Run Code Online (Sandbox Code Playgroud)
我可以使用我的检查器功能来访问属性:
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
Run Code Online (Sandbox Code Playgroud)
我的第一个方法:
function inspector(obj){
return function fun (prop){
console.log(obj[prop])
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它在某些情况下无法正常工作:
ins('o.a') // -> { b: 'b' }
ins('o.a.b') // -> b
ins('o.p') // -> undefined
ins('o.p.p') // -> undefined
Run Code Online (Sandbox Code Playgroud)
我怎样才能重写我的功能以适应这些情况?
您可以使用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
}
}
Run Code Online (Sandbox Code Playgroud)
测试o &&非常基础.如果你想下标o当且仅当o是一个对象,那么用以下内容替换该行:
return (o && typeof o === "object")? o[p]: undefined;
Run Code Online (Sandbox Code Playgroud)
返回o[p]if 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('')); // -> undefinedRun Code Online (Sandbox Code Playgroud)