有条件遍历

问题描述 投票:0回答:1

我正在使用一个分层数据集,遍历各个级别的儿童并根据某些条件对其进行转换。一旦完成转换,我需要将转换后的元素存储在对象数组中以供以后使用。

以下是我尝试过的示例。但它无法推动

else {if (d.req === "y")
块内发生的转变。

const data = [
    {
      name: "f1",req: "n",val: 0,
      children: [
        { name: "l1", req: "n", val: 1 },
        { name: "s1", req: "y", val: 2 },
        { name: "q1", req: "y", val: 3,
          children: [{ name: "i1" }, { name: "l1" }]
        }
      ]
    },
    { name: "d1", req: "n", val: 4, children: [{ name: "s1" }] }
  ];
  
  function traverse(data) {
    let container = [];

    data.forEach((d, i) => {
      if (d.req === "n") {
      
        //some external function
        //I want to push the result of external function to a container
        // for example
        
        container.push({ name: d.name, val: d.val * 100 });

        if (d.children) {
          traverse(d.children);

          d.children.forEach((d) => {
            if (d.req === "n") {
              container.push({ name: d.name, val: d.val * 100 });
            }
          });
        }
      } else {
        if (d.req === "y") {
        
          //some external function
          //I want to push the result of external function to a container
          // for example

          container.push({ name: d.name, val: d.val * -100 });

          if (d.children) {
            traverse(d.children);

            d.children.forEach((d) => {
              if (d.req === "y") {
                container.push({ name: d.name, val: d.val * -100 });
              }
            });
          }
        }
      }
    });
    return container;
  }
 console.log( traverse(data));

期望的最终结果如下。我不明白这里出了什么问题。

[{
        "name": "f1",
        "val": 0
    },
    {
        "name": "l1",
        "val": 100
    },
    {
        "name": "d1",
        "val": 400
    },
    {
        "name": "s1",
        "val": -200
    },
    {
        "name": "q1",
        "val": -300
    }
]
javascript parent-child traversal
1个回答
0
投票

您可以推送递归调用的结果。

const
    data = [{ name: "f1", req: "n", val: 0, children: [{ name: "l1", req: "n", val: 1 }, { name: "s1", req: "y", val: 2 }, { name: "q1", req: "y", val: 3, children: [{ name: "i1" }, { name: "l1" }] }] }, { name: "d1", req: "n", val: 4, children: [{ name: "s1" }] }];

function traverse(data) {
  let container = [];

  data.forEach((d, i) => {
    if (d.req === "n") {

      //some external function
      //I want to push the result of external function to a container
      // for example

      container.push({ name: d.name, val: d.val * 100 });
      container.push(...traverse(d.children || []));
    } else {
      if (d.req === "y") {

        //some external function
        //I want to push the result of external function to a container
        // for example

        container.push({ name: d.name, val: d.val * -100 });
        container.push(...traverse(d.children || []));

      }
    }
  });
  return container;
}
console.log(traverse(data));

© www.soinside.com 2019 - 2024. All rights reserved.