2017-03-03 21 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) 
相關問題