亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸函數在js中持久化結果

遞歸函數在js中持久化結果

慕桂英4014372 2023-05-19 14:24:57
我有以下代碼按順序獲取項目的所有名稱,例如 name1、name2、name3、name31、name32 ... 等等,還根據某些條件將某些選擇設置為 true 或 false。我正在嘗試使用遞歸函數來解決它。但是我不知道如何持久化結果并在最后返回它們。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: [] },      ],    },  ];  myfunc(items) {    const result = [];    for (const item of items) {      item.selected = false;      myfunc(item.children);      result.push(item.name);    }    return result;  } const result = myfunc(arr);
查看完整描述

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"]



查看完整回答
反對 回復 2023-05-19
?
狐的傳說

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}


查看完整回答
反對 回復 2023-05-19
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

const result = [];

function myfunc(items) {

    items.forEach((item)=>{

        item.selected = false;

        result.push(item.name);

        myfunc(item.children)

    })

    return result;

 }

將結果移到函數之外,否則每次調用都會聲明它,并且它的值將被重置。


查看完整回答
反對 回復 2023-05-19
?
守著一只汪

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);


查看完整回答
反對 回復 2023-05-19
  • 4 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號