找到最深的路径,向外迭代

时间:2017-01-23 14:44:12

标签: javascript

我有一个对象,它有多个子对象(这个对象是序列化的MongoDB记录)

{
  _id: '5881f6564d56a24f09562d9e',
  key: 'value',
  child: {
    _id: '5882211a010ea9725a3efdd1',
    key: 'value2',
    param: 'param',
    nested: {
      _id: '588221592eb1530d6fcc252a',
      arr: [ '588221b83f0f833ba132b670', '588224490a15d836d1ba56e4' ]
    }
  },
  another: {
    _id: '58822c4e48db7912655b3419',
    param: 'value'
  }
}

在我的应用程序中使用此对象之前,我需要通过函数传递它。

function processData(value) {
  // do stuff
  return value
}

但是,此功能(不受我控制)不支持嵌套文档。要正确处理对象,它必须从最深的嵌套文档开始,用返回值替换它,然后处理下一级别等。

'文档'是一个具有键_id的对象。可能有其他对象没有 _id,这些对象不需要处理。因此,需要按以下顺序处理:

obj.child.nested = processData(obj.child.nested)
obj.child = processData(obj.child)
obj.another = processData(obj.another)
obj = processData(obj)

该顺序仅对具有嵌套子项的对象有用(例如,obj.another可以在obj.child之前处理,只要在obj.child.nested之前处理obj.child)。

这是我到目前为止所做的:http://jsbin.com/nenuvuwiwa/edit?js,console

1 个答案:

答案 0 :(得分:0)

这是我最终使用的:

function processData(obj) {
  // Placeholder function to indicate it has
  // been processed (in reality sets a load of
  // prototype functions etc)
  obj.processed = true;
  return obj;
}

function processDoc(doc) {
  for (key in doc) {
    var val = doc[key];
    if (val.hasOwnProperty('_id')) {
      val = processDoc(val);
      val = processData(val)
    }
  }

  return doc;
}

var res = processDoc(obj)