我正在重构javascript中的对象以转换平面对象:
{
'we' : 'are',
'the' : 'knights',
'who' : 'say',
'ni' : '!!!'
}
到一个对象中,其中平面对象中的一些项目包含在原始平面对象的子项中:
{
'we' : 'are',
'the' : 'knights',
'shrubbery' : {
'who' : 'say',
'ni' : '!!!'
}
}
我可以通过引用然后删除来进行重组,如下所示:
var knights = {
'we' : 'are',
'the' : 'knights',
'who' : 'say',
'ni' : '!!!'
};
knights.shrubbery = {'who':knights.who,
'ni':knights.ni};
delete knights.who;
delete knights.ni;
但这似乎不优雅。有没有更好的方法将一个对象的属性移动到另一个对象或以其他方式将对象的属性捆绑到该对象的子对象中?
最终,我要做的是在数据树中形成一个扁平对象,其中根根对象可以包含包含子组的组等等。有点像这样:
{'leaf1':'',
'leaf2':'',
'leaf3':'',
'leaf4':'',
'leaf5':'',
'leaf6':'',
'leaf7':'',
'leaf8':'',
'leaf9':''
}
进入这个:
{'leaf1':'',
'leaf2':'',
'leaf3':'',
'groups' : [
{
'leaf1':''
},{
'leaf1':'',
'leaf2':'',
'groups':[
{
'leaf7':'',
'leaf8':'',
'leaf9':''
}
]
}
]
}
答案 0 :(得分:1)
我认为您当前的方法没有任何问题,但为了使其更具可扩展性,您可以将其包装在函数中:
function restructure(obj, new_child, properties) {
obj[new_child] = {};
for (var i = 0; i < properties.length; i++) {
obj[new_child][properties[i]] = obj[properties[i]];
delete obj[properties[i]];
}
}
restructure(knights, 'shrubbery', ['who', 'ni']);
答案 1 :(得分:1)
我建议在一般情况下编写一种方法来做这样的事情。我不建议在适当的位置改变对象,因为通常情况下,你会更多地使用创建副本的对象。
这是一个想法:签名方法如何:
像这样:
function nestProperties(obj, property, nestedProperties)
{
var newObj = {};
var nestedObj = {};
for (var i = 0; i < nestedProperties.length; ++i)
{
if (nestedProperties[i] in obj)
{
nestedObj[nestedProperties[i]] = obj[nestedProperties[i]];
}
}
for (var k in obj)
{
if (!(k in nestedObj))
{
newObj[k] = obj[k];
}
}
newObj[property] = nestedObj;
return newObj;
}
你会像这样使用它:
var flat = {
'we' : 'are',
'the' : 'knights',
'who' : 'say',
'ni' : '!!!'
};
var knights = nestProperties(flat, 'shrubbery', ['who', 'ni']);