2017-12-27 346 views
-2

我有一个我一直在使用和工作的代码片段。它在我的应用程序中使用很多,我需要加快速度。以字符串路径深入访问对象是否有更好的方法?它需要能够访问的属性和方法,请参阅我下面的例子:访问在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)); 
+2

如果这是**工作代码**,你认为可以改进,参见[codereview.se。否则,请澄清具体问题。 – jonrsharpe

+0

感谢您的提示! – MartinWebb

+1

这与函数式编程有什么关系?你为什么要为函数*值*做一个例外? – naomik

回答

1

你的问题的本质 - 即,访问深性编程 - 显示你正在接近函数式编程与自己的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

+0

在你的测试中你不会返回一个方法,在我的代码中它返回属性和方法,{a:1,b:function(){return {c:1}}} – MartinWebb

+0

为什么要用功能风格,你会不会带着你的oo风格习惯?你的问题没有意义:( – naomik

+0

对不起,如果我的问题没有意义,我想要做的就是讨论是否可以优化我的代码以返回显示的结果? – MartinWebb