var data = [{
id: 1,
name: '電器',
goods: [{
id: 11,
name: '冰箱',
goods: [{
id: 111,
name: '海爾'
}]
}, {
id: 12,
name: '空調',
goods: [{
id: 121,
name: '格力'
}]
}]
}, {
id: 2,
name: '食品',
goods: [{
id: 21,
name: '薯片'
}]
}]
// 利用遞回forEach()遍歷陣列內的的資料
function getID(product, id) {
var o = {}
product.forEach(function(item) {
if (item.id === id) {
o = item;
console.log(o)
} else if (item.goods && item.goods.length > 0) {
getID(item.goods, id)
}
})
return o;
}
console.log(getID(data, 121))
以上代碼段中,第一個log正常輸出,但是為何第二個log輸出是一個空物件,正常不是進行getID(item.goods, id)遞回之后item遍歷到的符合的物件存盤在了o這個空物件里面了嗎,怎么列印出來是個{ }?(輸出結果如下圖所示)
uj5u.com熱心網友回復:
因為你要操作的物件o定義在函式內部,,然后你每次getID時都會將其重置為{}uj5u.com熱心網友回復:
重置為0 之后不是又賦值了嗎[align=center]
if (item.id === id) {
o = item;
console.log(o)
} else if (item.goods && item.goods.length > 0) {
getID(item.goods, id)
}[/align]
uj5u.com熱心網友回復:
我其實就想知道為何第一層沒被重置而第二層開始就會重置呢?
uj5u.com熱心網友回復:
我大概明白了,是因為回圈會走完它,每次走都會走到最后一個物件也就是名字為食品的那個物件,食品物件不符合查找的要求,沒有執行if跟else if ,但是又遞回重置了物件o。
uj5u.com熱心網友回復:
差不多,除非你要找的是1和2
而且因為Array.forEach一定會遍歷完所有元素的特性。它也不適合用來這樣子遞回查找。它不會在找到目標后第一時間跳出。不如用經典的for回圈來處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/282056.html
標籤:JavaScript

