Javascript JS如何在子对象上定义函数

Javascript JS如何在子对象上定义函数,javascript,Javascript,我有一个包含嵌套对象的对象,比如: var root = { 'areas' : [ { 'areaName' : 'A1', 'modules' : [ { 'moduleName' : 'M1', moduleType : 'F' }, { 'moduleName' : 'M2', moduleType : 'F' }] }, { 'areaName' : A2,

我有一个包含嵌套对象的对象,比如:

var root = {
   'areas' : [
        {  'areaName' : 'A1',
           'modules' : [ { 'moduleName' : 'M1', moduleType : 'F' },
                         { 'moduleName' : 'M2', moduleType : 'F' }] },
        {  'areaName' : A2,
           'modules' : [ { 'moduleName' : 'M1', moduelType : 'B' },
                         { 'moduleName' : 'M2', moduleType : 'F' }] }
   ];        
}
这是从WS-Server返回的Json。我想定义一个可以在模块上调用的函数。让我们说:

root.A1.M2.Foo();
1) 这能以时尚的方式完成吗?我可以迭代for循环中的所有对象,并为每个对象添加函数。但我更倾向于使用原型或类似的东西

2) 是否可以定义此函数,使其了解其在层次结构中的位置?因此,您可以:

function Foo(){
     var module = ... ('this', I assume)
     var area = ...
     var root = ...
} 
3) 附加问题:只有在满足特定条件的情况下才能存档以添加功能吗?因此Foo()只添加到moduleType='F'的模块中,Bar()添加到moduleType='B'的模块中

root.A1.M1.Foo(); // good
root.A2.M1.Bar(); // good
root.A2.M2.Bar(); // bad
我确实可以控制WS,所以以另一种格式返回对象是可能的,尽管不是最好的

期待您的创意解决方案

1)array.prototype.map()可以帮助您


2和3)对不起,我不理解语言限制

使用
ECMASCRIPT-6代理可以获得良好的结果,如下所述:

不幸的是,目前对es6代理的支持并不好,但几乎所有供应商都在努力尽快提供它


这是一个google polyfill:

您可以考虑从套接字接收的对象,比如必须反序列化的原始数据[1]。因此,您可以定义一个工厂[2],它接受这些原始数据,并使用所需的格式和方法构造对象。作为奖励,这将帮助您将数据表示与逻辑分离,以便将来您可以更轻松地更改通过网络发送的数据格式


  • 试图得到你想要的东西。这直接转到第3点,返回一个具有依赖名称的函数。reurn值是路径,它可以是对该对象或其他对象的所有其他引用

    你的第二点有点含糊,你应该在哪里

    var module = ... ('this', I assume)
    var area = ...
    var root = ...
    
    指什么

    另一个问题是,结构是否固定?这些房子是固定的吗?答案:结果应该指向哪里?是对原来的目标,还是像这个建议一样对另一个

    功能iter(o,r,键,a){
    键=键| |“根”;
    a=a | |[键];
    Object.keys(o).forEach(函数(k){
    if(~k.indexOf('Name')){
    a=a.切片();
    r[key]=r[key]| |{};
    r=r[键];
    键=o[k];
    a、 推(o[k]);
    返回;
    }
    if(~k.indexOf('Type')){
    r[key]={};
    r[key][{F:'Foo',B:'Bar'}[o[k]]]=function(){
    返回a;
    };
    返回;
    }
    if(Array.isArray(o[k])){
    o[k].forEach(函数(b){
    国际热核实验堆(b,r,键,a);
    });
    返回;
    }
    if(o[k]=“对象”的类型){
    iter(o[k],r,key,a);
    }
    });
    }
    var object={root:{areaName:[{areaName:'A1',模块:[{moduleName:'M1',moduleType:'F'},{moduleName:'M2',moduleType:'F'}]},{areaName:'A2',模块:[{moduleName:'M1',moduleType:'B'},{moduleName:'M2',moduleType:'F'}},
    结果={};
    iter(目标、结果);
    document.write(“”+JSON.stringify(结果,0,4)+“”);
    document.write(result.root.A1.M1.Foo();
    document.write(result.root.A1.M2.Foo();
    document.write(result.root.A2.M1.Bar()+'
    );
    document.write(result.root.A2.M2.Foo()我打算将root作为结果,因此不需要添加额外的级别。另外还有Foo()/Bar(),其中将有不同的实现。但我可以从它开始,然后找出剩下的。
    var module = ... ('this', I assume)
    var area = ...
    var root = ...