[英]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 。
您可以遞歸減少節點並計算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.