Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.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_Arrays_Object_Recursion - Fatal编程技术网

在javascript递归函数中增加一个参数

在javascript递归函数中增加一个参数,javascript,arrays,object,recursion,Javascript,Arrays,Object,Recursion,我将以下数据存储在变量中: let categories = [ { name: "a", selected: false, nodes: [ { name: "aa", selected: false }, { name: "ab", selected: true }, { name: "ac", sel

我将以下数据存储在变量中:

let categories = [
    {
    name: "a",
    selected: false,
    nodes: [
        {
        name: "aa",
        selected: false
      },
      {
        name: "ab",
        selected: true
      },
      {
        name: "ac",
        selected: true
      },
      {
        name: "ad",
        selected: false
      }
    ]
  },
  {
    name: "b",
    selected: false,
    nodes: [
        {
        name: "ba",
        selected: false
      },
      {
        name: "bb",
        selected: true
      },
      {
        name: "bc",
        selected: true
      },
      {
        name: "bd",
        selected: false
      }
    ]
  }
];
我想计算选择了多少项=true。 因此,我创建了以下函数:

function getSelected(categories, counter = 0) {
    for (let index = 0; index < categories.length; index++) {
        const category = categories[index];
    if (category.selected) {
        counter++;
    }
    if (category.nodes && category.nodes.length) {
        category.nodes.forEach(cat => getSelected([cat], counter));
    }
    }
  return counter;
}
但它总是返回0


您可以对所选节点和计数进行递归减少

常数 countSelected=s,o=>o.nodes | |[])。reducecountSelected,s+o.selected; 让类别=[{name:a,selected:false,nodes:[{name:aa,selected:false},{name:ab,selected:true},{name:ac,selected:true},{name:ad,selected:false},{name:b,selected:false,nodes:[{name:ba,selected:false},{name:bb true},{name:bc,selected:true},{name:bd,selected:false},},}, count=categories.reducecountSelected,0;
console.logcount 您可以对所选节点和计数进行递归减少

常数 countSelected=s,o=>o.nodes | |[])。reducecountSelected,s+o.selected; 让类别=[{name:a,selected:false,nodes:[{name:aa,selected:false},{name:ab,selected:true},{name:ac,selected:true},{name:ad,selected:false},{name:b,selected:false,nodes:[{name:ba,selected:false},{name:bb true},{name:bc,selected:true},{name:bd,selected:false},},}, count=categories.reducecountSelected,0; console.logcount 计数器是一个整数,所以它在这里按值传递。 将计数器设置为您希望从函数返回的结果,然后执行以下操作:

函数getSelectedcategories{ var计数器=0; 对于let index=0;indexcounter+=getSelected[cat]; } } 返回计数器; } console.loggetSelectedcategories; 计数器是一个整数,所以它在这里按值传递。 将计数器设置为您希望从函数返回的结果,然后执行以下操作:

函数getSelectedcategories{ var计数器=0; 对于let index=0;indexcounter+=getSelected[cat]; } } 返回计数器; } console.loggetSelectedcategories; 这是因为函数的参数是重复的,所以它创建了一个用参数值初始化的全新变量

您可以使用函数的返回值并求和,也可以使用对象作为参数,因为它们是通过引用发送的,所以您可以保留相同的对象:

让类别=[{name:a,selected:false,节点:[{name:aa,selected:false},{name:ab,selected:true},{name:ac,selected:true},{name:ad,selected:false},{name:b,selected:false,节点:[{name:ba,selected:false},{name:bb,selected:true},{name:bc,selected:true},{name:bd,selected:false}] 函数getSelectedWithObjectcategories,计数器={val:0}{ 对于let index=0;indexgetSelectedWithObject[cat],计数器 } } 返回计数器.val } 函数getSelectedWithReturnValuecategories{ 设计数器=0 对于let index=0;indexcounter+=getSelectedWithReturnValue[cat] } } 返回计数器 } console.loggetSelectedWithObjectcategories loggetSelectedWithReturnValuecategories这是因为函数的参数是重复的,它创建了一个用参数值初始化的全新变量

您可以使用函数的返回值并求和,也可以使用对象作为参数,因为它们是通过引用发送的,所以您可以保留相同的对象:

让类别=[{name:a,selected:false,节点:[{name:aa,selected:false},{name:ab,selected:true},{name:ac,selected:true},{name:ad,selected:false},{name:b,selected:false,节点:[{name:ba,selected:false},{name:bb,selected:true},{name:bc,selected:true},{name:bd,selected:false}] 函数getSelectedWithObjectcategories,计数器={val:0}{ 对于let index=0;indexgetSelectedWithObject[cat],计数器 } } 返回计数器.val } 函数getSelectedWithReturnValuecategories{ 设计数器=0 对于let index=0;indexcounter+=getSelectedWithReturnValue[cat] } } 返回计数器 } console.loggetSelectedWithObjectcategories
console.loggetSelectedWithReturnValuecategoriesPS:节点的深度未知,因此如果我们有更深的节点,reduce将不起作用。它适用于所有嵌套节点属性,因为is使用递归。请查看countSelected的reduce。PS:节点的深度未知,因此如果有更深的节点,reduce将不起作用。它适用于所有嵌套节点属性,因为它使用递归。请查看所选计数的减少。