4 回答

TA貢獻1784條經驗 獲得超2個贊
你可以得到names使用Array.prototype.flatMap-
const names = t =>
t.flatMap(v => [ v.name, ...names(v.children) ])
names(arr)
// ...
["name1", "name2", "name3", "name31", "name32", "name321", "name322", "name323", "name33", "name4"]

TA貢獻1804條經驗 獲得超3個贊
我強烈建議對于您嘗試做的兩件事,即查找名稱列表和更改某些值select,您可以在兩個單獨的函數中進行。
您總是可以編寫一個包裝函數來完成這兩項工作,但是這兩者有不相關的要求;將它們結合起來會增加不必要的復雜性。
這里已經有一個很好的名稱解決方案??吹絋hankyou的回答。
對于其他要求,我建議您分成三個不同的部分?!案鶕承l件將某些選擇設置為 true 或 false”是兩部分:一個用于測試您的條件,另一個用于進行更改。第三部分是執行數據實際遍歷的代碼。(此外,可能還有第四個;我在下面的示例假設您僅在條件為真時才對數據執行某些操作,但您可以運行兩種不同的操作:一個為真,另一個為假。)
你實際上沒有描述你的情況,所以我會補一個。我要說的是,如果末尾的數字name為奇數,則條件為真。我們需要一個函數來返回設置為 true 的對象版本selected。這里有兩個簡單的輔助函數:
const nameIsOdd = ({name}) =>
Number (name .replace (/\D/g, '')) % 2 === 1
const selectedTrue = ({select, ...rest}) =>
({...rest, selected: true})
(請注意,我說我們返回一個具有更新屬性的對象。我更喜歡使用不可變的數據,并返回我的結構的更改版本,而不是對結構進行更改。)
現在我們可以編寫一個函數來遞歸遍歷一組具有children屬性的對象,接受一個謂詞函數和一個來創建更新的節點。其實很簡單:
const alterNodes = (pred, change) => (xs) =>
xs .map (({children = [], ...rest}) => ({
... (pred (rest) ? change (rest) : rest),
children: alterNodes (pred, change) (children)
}))
使用它,我們現在非常簡單地編寫我們的主要功能:
const fixSelected = alterNodes (nameIsOdd, selectedTrue)
您可以在以下代碼片段中看到這一點:
const alterNodes = (pred, change) => (xs) =>
xs .map (({children = [], ...rest}) => ({
... (pred (rest) ? change (rest) : rest),
children: alterNodes (pred, change) (children)
}))
const nameIsOdd = ({name}) =>
Number (name .replace (/\D/g, '')) % 2 === 1
const selectedTrue = ({select, ...rest}) =>
({...rest, selected: true})
const fixSelected = alterNodes (nameIsOdd, selectedTrue)
const arr = [{name: 'name1', selected: true, children: [{name: 'name2', selected: false, children: []}, {name: 'name3', selected: false, children: [{name: 'name31', selected: false, children: []}, {name: 'name32', selected: false, children: [{name: 'name321', selected: false, children: []}, {name: 'name322', selected: false, children: []}, {name: 'name323', selected: false, children: []}]}, {name: 'name33', selected: false, children: []}]}, {name: 'name4', selected: false, children: []}]}];
console .log (fixSelected (arr))
.as-console-wrapper {max-height: 100% !important; top: 0}

TA貢獻2080條經驗 獲得超4個贊
const result = [];
function myfunc(items) {
items.forEach((item)=>{
item.selected = false;
result.push(item.name);
myfunc(item.children)
})
return result;
}
將結果移到函數之外,否則每次調用都會聲明它,并且它的值將被重置。

TA貢獻1872條經驗 獲得超4個贊
您已經在遞歸調用中初始化了結果變量,它將僅返回初始值,所有迭代值都將被省略。
這將工作,
temp = [];
function myfunc(items) {
for (item of items) {
temp.push(item.name);
if (typeof item.children !== 'undefined') {
myfunc(item.children);
}
}
return temp; //this is optional, use temp directly
}
const result = myfunc(arr);
添加回答
舉報