2017-03-03 23 views
1

请看fiddle。 我有点卡住了为什么循环不打破我的意图。从一个看起来里面有一个reucrsive功能

input是一个对象,用某种id索引。值是儿童ID。所以,我试图过滤掉(这里是硬编码为d)节点及其子节点。例如,对于d,只有一个孩子,h。所以,我期待输出['d', 'h']。这是因为,一旦过滤条件满足(c === 'd'),它会丢弃所有以前的值,并在这种情况下递归给子项(仅限于h)。一旦递归到孩子完成,中断应该终止for循环。但正如我从输出中看到的,for循环不会中断并继续(c - >g)。如何做到这一点,一旦过滤器满足,它只输出节点及其所有子女['d', 'h']在这种情况下。

const input = { 
    a: ['b', 'c'], 
    b: ['d', 'e', 'f'], 
    c: ['g'], 
    d: ['h'], 
} 
let data = []; 
const recur = (d) => { 
    const ch = input[d] 
    if (!ch) { 
    return; 
    } 

    for (let i = 0; i < ch.length; i++) { 
    console.log(data) 
    const c = ch[i] 
    data.push(c) 
    if (c === 'd') { 
     data = [c]; 
     console.log("reset data", data) 
     recur(c) 
     break 
    } 
    recur(c) 
    } 
} 

recur('a') 
console.log("end: ", data) 

输出:end: ["d", "h", "c", "g"]

+0

这将有助于如果你解释_intended behaviour_ – Alnitak

+0

使用while语句,或[] .forEach(),而不是 – Supersharp

+0

@Supersharp出于好奇,什么是错的for循环。我认为break可以和'for'一起工作 – bsr

回答

0

这是我想出了。 https://jsfiddle.net/j6s1vouv/4/需要一种方法告知父级,过滤器已满足,应跳过兄弟迭代。

const input = { 
    a: ['b', 'c'], 
    b: ['d', 'e', 'f'], 
    c: ['g'], 
    d: ['h'], 
} 
const recur = (d) => { 
    const ch = input[d] 
    if (!ch) { 
    return { 
     data: [] 
    }; 
    } 

    let out = []; 
    for (let i = 0; i < ch.length; i++) { 
    const c = ch[i] 
    const x = recur(c) 
    if (x.skip) { // if any of the child met filter 
     return x 
    } 

    if (c === 'd') { // current id met filter 
     return { 
     data: [c].concat(x.data), 
     skip: true 
     } 
    } 

    out = out.concat([c], x.data) 
    } 
    return { 
    data: out 
    } 
} 


console.log("end: ", recur('a').data) 
相关问题