访问在javascript中使用字符串路径的深层属性和方法
我有一个我一直在使用和工作的代码片段。它在我的应用程序中使用很多,我需要加快速度。以字符串路径深入访问对象是否有更好的方法?它需要能够访问的属性和方法,请参阅我下面的例子:访问在javascript中使用字符串路径的深层属性和方法
function get(obj, path) { var paths = path.split('.'),
curProp = obj;
for(var i=0;i<paths.length;i++){
if (!curProp[paths[i]]) return
curProp = (typeof curProp[paths[i]] !== "function") ? curProp[paths[i]] : curProp[paths[i]]() ;
}
return curProp;
}
的片段通过该对象的路径将继承属性传递
var obj = {contact:{name:"john"}}; console.log(get("contact.name",obj));
如果对象有一个返回的方法反对它可以返回太
var obj = {contact:function(){return {name:"john"}}}; console.log(get("contact.name",obj));
回答:
你的问题的本质 - 即,访问深性编程 - 显示你正在接近函数式编程与自己的IDE至于它应该如何工作。
功能风格的程序不会以这种方式使用对象。即使我们可以用功能性风格(下面)来表达程序,无论使用get
函数的程序的任何部分都应该重构,而不是使用动态对象和动态对象查找。
同样,使用方法来存储对象的值也来自面向对象的风格。一旦你停止思考OO风格的事情,你就会开始看到功能风格的独特优势。
const recur = (...values) => ({ tag: recur, values })
const loop = (f) =>
{
let acc = f()
while (acc && acc.tag === recur)
acc = f (...acc.values)
return acc
}
const get = (obj = {}, path = []) =>
loop ((o = obj, [p, ...ps] = path.split ('.')) =>
(p === undefined)
? o
: o[p] === undefined
? undefined
: recur (o[p], ps))
const data =
{ a: { b: { c: 1, d: null } } }
console.log (get (data, 'a')) // { b: { c: 1 } }
console.log (get (data, 'a.b')) // { c: 1 }
console.log (get (data, 'a.b.c')) // 1
console.log (get (data, 'a.b.c.')) // undefined
console.log (get (data, 'd')) // undefined
console.log (get (data, 'a.b.d')) // null
以上是 访问在javascript中使用字符串路径的深层属性和方法 的全部内容, 来源链接: utcz.com/qa/266422.html