Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用字符串路径访问深层属性和方法_Javascript_Functional Programming - Fatal编程技术网

在javascript中使用字符串路径访问深层属性和方法

在javascript中使用字符串路径访问深层属性和方法,javascript,functional-programming,Javascript,Functional Programming,我有一个代码片段,我一直在使用和工作。它在我的应用程序中被大量使用,我需要加快它的速度。有没有一种更快更好的方法可以使用as字符串路径深入访问对象。它需要能够访问属性和方法,请参见下面的示例: function get(obj, path) { var paths = path.split('.'), curProp = obj; for(var i=0;i<paths.length;i++){ if (!c

我有一个代码片段,我一直在使用和工作。它在我的应用程序中被大量使用,我需要加快它的速度。有没有一种更快更好的方法可以使用as字符串路径深入访问对象。它需要能够访问属性和方法,请参见下面的示例:

     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:function(){return {name:"john"}}};
console.log(get("contact.name",obj));

您问题的本质——即以编程方式访问深层属性——表明您正在以自己的想法来处理函数式编程

函数式程序不会以这种方式使用对象。即使我们可以用函数式(如下)来表达您的程序,您的程序中使用
get
函数的任何部分都应该进行重构,以避免使用动态对象和动态对象查找

类似地,使用方法存储对象的值也来自面向对象的风格。一旦你停止用OO风格思考问题,你就可以开始看到功能风格的独特优势

const recur=(…值)=>
({tag:recur,values})
常量循环=(f)=>
{
设acc=f()
while(acc&&acc.tag==重复)
acc=f(…acc.值)
返回acc
}
const get=(obj={},path=[])=>
循环((o=obj,[p,…ps]=path.split('.')=>
(p==未定义)
?o
:o[p]==未定义
?未定义
:重现(o[p],ps))
常量数据=
{a:{b:{c:1,d:null}}
console.log(get(data,'a'))/{b:{c:1}
console.log(get(data,'a.b'))/{c:1}
console.log(获取(数据'a.b.c'))//1
console.log(获取(数据'a.b.c.)//未定义
console.log(get(data,'d'))//未定义

console.log(get(data,'a.b.d'))//null
如果这是您认为可以改进的工作代码,请参阅。否则,请澄清具体问题。谢谢提示!这与函数式编程有什么关系?为什么要对函数值做一个例外?在测试中,你不返回方法,在我的代码中,它返回属性和方法,{a:1,b:function(){return{c:1}}}}如果你只是想带上你的oo风格习惯,为什么还要麻烦函数风格呢?你的问题没有真正意义:(很抱歉,如果我的问题没有意义,那么我想做的就是讨论我的代码是否可以优化以返回显示的结果?当然,如果没有看到整个程序,就不可能说,但是在我看来,在对象上使用动态属性是一个糟糕的设计-当您有保证已知(静态)的对象时属性,它为您的代码提供了各种便利。使用动态属性,您永远无法确定是否设置了任何此类属性,也无法知道该属性将是什么类型,因此您必须在程序的其他部分执行各种安全检查。这是您自己发明的噩梦。一些oo风格的习惯用法可以适应功能性风格“同等”;有些不能。(…续)换句话说,你有没有看过谷歌的JavaScript代码?太可怕了。它充满了冗长丑陋的模式,奇怪的,似乎不必要的间接操作,等等。为什么?因为他们的代码必须在任何东西中运行,从内置在游戏机和烤面包机中的web浏览器到他们自己的桌面chrome浏览器,都必须始终如一、快速运行。我们大多数人,甚至大多数人都是谷歌的浏览器如果我们生产面向客户的软件,不要占领这个世界。我们应该优化简洁性、可维护性、可靠性等。我们有许可证可以使用他们希望使用的东西(如FP),并且应该使用。
var obj = {contact:function(){return {name:"john"}}};
console.log(get("contact.name",obj));