2

我正在用 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':''
         }
     ]
     }
]
}
4

2 回答 2

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']);
于 2013-07-24T16:41:31.083 回答
1

我建议在一般情况下编写一个方法来做这样的事情。我不建议就地改变对象,因为通常情况下,您会从创建副本的对象中获得更多用途。

这是一个想法:方法签名如何:

  1. 一个东西
  2. 属性名称
  3. 嵌套在新属性中的属性名称列表

像这样:

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']);
于 2013-07-24T16:41:44.857 回答