JS - 财产更换

AJ_*_*AJ_ 9 javascript properties object

亲爱的Stack Overflow社区,
我有一个关于对象属性替换的问题(你可以跳到底部阅读问题).我正在开发一个应用程序,它从后端获取一个教师对象.后端使用java hibernate来查询数据库并序列化要发送到前端的对象(我).我得到了这个教师对象,但是对象中有循环引用.通过添加引用ID代替对象来处理哪个java.所以我得到了这个教师对象,并且在对象内部是我需要用实际对象替换的这些引用id,问题在于它们是嵌套对象.我目前所做的是创建一个堆栈,并遍历对象以找到这些id和引用id.当我找到一个id时,我把它放在堆栈上.不是问题,但是当我找到引用ID时,我需要使用我在堆栈中找到的那个来重新引用它.再一次这很难做到,因为我通过递归函数来做这些,所以我没有物理对象.

我的问题是,如何替换嵌套对象属性

JS BIN

var stack = {};
var add = function(prop, data) {
  if (prop == '@id') {
    stack[data[prop]] = data;
  }
  if (prop == '@ref') {
    // console.log(stack[data[prop]])
    // How do i replace the value with the stack object 
    // test.PROPERTY = stack[data[prop]] is what im looking for
  }
}
var traverse = function(object) {
  for (var property in object) {
    if (object.hasOwnProperty(property)) {
      add(property, object);
      if (object[property] && typeof object[property] === 'object') {
        traverse(object[property]);
      }
    }
  }
}
var test = {
  'teacher': {
    'course': {
      "@id": "1",
      'students': [{
        "@id": "2",
        'name': "John",
        'course': {
          "@ref": "1",
        }
      }, {
        "@id": "2",
        'name': "Next",
        'course': {
          "@ref": "1",
        }
      }]
    }
  }
};
setTimeout(() => {
  console.log(stack);
  // console.log(test); 
}, 500);
traverse(test);
Run Code Online (Sandbox Code Playgroud)

Mic*_*nai 3

考虑对数据结构进行两次迭代:

  1. 用于填充 id 到对象映射的递归遍历(其中键是 id,值是实际对象)。您可以在第一个递归调用中初始化映射,然后将其传递到下一个递归级别。

  2. 递归遍历,用实际对象替换引用。由于您现在有了地图,因此可以就地完成此替换。

代码