【发布时间】:2018-05-06 08:36:20
【问题描述】:
尊敬的 Stack Overflow 社区,
我有一个关于对象属性替换的问题(您可以跳到底部阅读问题)。我正在开发一个从后端获取教师对象的应用程序。后端使用 java hibernate 来查询数据库并序列化要发送到前端(我)的对象。我得到了这个教师对象,但对象中有循环引用。哪个 java 通过添加引用 id 代替对象来处理。所以我得到了这个教师对象,对象内部是我需要用实际对象替换的这些参考 ID,问题是它们是嵌套对象。我目前所做的是创建一个堆栈,并遍历对象以找到这些 id 和引用 id。当我找到一个 id 时,我把它放在堆栈上。没问题,但是当我找到一个参考 id 时,我需要用我在堆栈上找到的那个来替换它。再一次,这很难做到,因为我通过递归函数来做这些,所以我没有物理对象。
我的问题是,如何替换嵌套对象属性
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);
【问题讨论】:
-
除了噪音,你还有什么,你想要什么?请在更改前后添加数据。
-
@NinaScholz 我目前没有对数据做任何事情,因为我不确定如何从我的函数中引用对象数据。有意义吗?
-
@ref是有原因的。如果您尝试用实际对象替换ids,您可能会遇到循环引用,这会导致内存泄漏(这将导致最大调用堆栈大小错误)。 -
你想要的最终对象模式是什么?
-
尽量保持你的前端轻量,保持你的编码灵活,并要求你的服务器完成工作。如果您无法更改服务器端,请使用@Vadim 的解决方案
标签: javascript object properties