在迭代其属性时修改JavaScript对象
javascript能在函数调用上实现引用传递技术吗?你看,我有下面的在迭代其属性时修改JavaScript对象,javascript,json,Javascript,Json,javascript能在函数调用上实现引用传递技术吗?你看,我有下面的JSON,我需要遍历它的所有节点。在遍历时,如果当前项是对象并且包含键节点,则必须将另一个属性isParent:true添加到该完全相同的项。但是我在创建具有这种特性的遍历函数时遇到了困难,我尝试搜索遍历函数,但我找到的只是返回一个新的JSON对象,而不是更改正在处理的确切JSON var default_tree = [ { text: "Applications", nodes: [
JSON
,我需要遍历它的所有节点。在遍历时,如果当前项是对象
并且包含键节点
,则必须将另一个属性isParent:true
添加到该完全相同的项。但是我在创建具有这种特性的遍历函数时遇到了困难,我尝试搜索遍历函数,但我找到的只是返回一个新的JSON
对象,而不是更改正在处理的确切JSON
var default_tree = [
{
text: "Applications",
nodes: [
{
text: "Reports Data Entry",
nodes: [
{ text: "Other Banks Remittance Report" },
{ text: "Statement of Payroll Deduction" },
...
]
},
{
text: "Suspense File Maintenance",
nodes: [
{ text: "Banks with Individual Remittances" },
{ text: "Employers / Banks with Employers" },
...
]
}
]
},
{
text: "Unposted Transactions",
nodes: [
{ text: "Unposted Borrower Payments"},
{ text: "Unposted CMP Payments"}
]
},
{ text: "Maintenance" },
{
text: "Reports",
nodes: [
{
text: "Daily Reports",
nodes: [
{
text: "List of Remittance Reports",
nodes: [
{ text: "Banks" },
...
{
text: "Employers-LBP",
nodes: [
{ text: "Employers-Zonal" }
]
},
]
},
...
]
},
...
]
}
]
考虑到我们有这个遍历函数:
function traverse(json_object) {
// perform traversal here
}
traverse(default_tree)
运行遍历函数后,默认_树
的值将保持不变,除非执行以下操作:
default_tree = traverse(default_tree)
有人能帮我创建一个迭代器吗?它将在迭代时真正改变正在处理的对象
,而不是返回一个新的对象
?请检查这个
var default_tree = [....] //Array
function traverse(arrDefaultTree){
arrDefaultTree.forEach(function(val,key){
if(val.hasOwnProperty("nodes")){
val.isParent = true;
traverse(val.nodes);
}
})
}
traverse(default_tree);
console.log(default_tree);
希望这有帮助。有两个函数,一个调用self。一个找到节点,另一个通过数组循环
traverseTree(default_tree);
function traverseTree (tree) {
var i = 0, len = tree.length;
for(;i < len; i++) {
var obj = tree[i];
findNodes(obj);
}
}
function findNodes (obj) {
var keys = Object.keys(obj);
if (keys.indexOf('nodes') > -1) {
obj.isParent = true;
traverseTree(obj.nodes);
}
}
traverseTree(默认的_树);
函数遍历树(树){
变量i=0,len=tree.length;
对于(;i-1){
obj.isParent=true;
traverseTree(对象节点);
}
}
如果obj
引用了一个对象,则obj.foo=42
会对该对象进行变异。它不会创建一个新的。然而,JS总是按值传递,但我假设您误用了术语“按引用传递”。另外,请注意,您需要一个对象数组。这与JSON无关。@Gideon有嵌套对象包含“node”。你也需要这样做吗?@RIYAJKHAN是的,迭代器需要遍历到最深的节点,检查并添加isParent:true
键/值(如有必要)。只需添加属性,没有什么特别的事情要做。运行遍历功能后,默认树的值将保持不变”“没有。这完全取决于您在函数中所做的操作。如果default_tree
是一个对象,并且您执行json_object.foo=42代码>在函数内部,然后对对象进行变异。这里是一个简化的例子:功能条(baz){baz.xyz=42;};var foo={};控制台日志(bar(foo))代码>