Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在迭代其属性时修改JavaScript对象_Javascript_Json - Fatal编程技术网

在迭代其属性时修改JavaScript对象

在迭代其属性时修改JavaScript对象,javascript,json,Javascript,Json,javascript能在函数调用上实现引用传递技术吗?你看,我有下面的JSON,我需要遍历它的所有节点。在遍历时,如果当前项是对象并且包含键节点,则必须将另一个属性isParent:true添加到该完全相同的项。但是我在创建具有这种特性的遍历函数时遇到了困难,我尝试搜索遍历函数,但我找到的只是返回一个新的JSON对象,而不是更改正在处理的确切JSON var default_tree = [ { text: "Applications", nodes: [

javascript能在函数调用上实现引用传递技术吗?你看,我有下面的
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))