簡體   English   中英

增加javascript遞歸函數中的參數

[英]Increment a parameter in a javascript recursive function

我將以下數據存儲在變量中:

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
      }
    ]
  }
];

我想計算selected = true了多少項目selected = 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

一個有效的 jsFiddle

您可以遞歸減少節點並計算selected

 const countSelected = (s, o) => (o.nodes || []).reduce(countSelected, s + o.selected); 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 }] }], count = categories.reduce(countSelected, 0); console.log(count);

這是因為函數的Number(和其他原語)參數是重復的,它創建了一個用參數值初始化的全新變量。

您可以做的是使用函數的返回值並將其求和,或者您可以使用對象作為參數,因為它們是通過引用發送的,因此您保留相同的對象:

 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}]}] function getSelectedWithObject(categories, counter = {val: 0}) { for (let index = 0; index < categories.length; index++) { const category = categories[index] if (category.selected) { counter.val++ } if (category.nodes && category.nodes.length) { category.nodes.forEach(cat => getSelectedWithObject([cat], counter)) } } return counter.val } function getSelectedWithReturnValue(categories) { let 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 => counter += getSelectedWithReturnValue([cat])) } } return counter } console.log(getSelectedWithObject(categories)) console.log(getSelectedWithReturnValue(categories))

counter是一個整數,所以它在這里按值傳遞。 使counter成為您想要從函數中返回的結果,然后就可以了:

function getSelected(categories) {
    var 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 => counter += getSelected([cat]));
        }
    }
    return counter;
}

console.log(getSelected(categories));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM