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 = ...