搜尋

首頁  >  問答  >  主體

利用reduce操作對物件進行操作

<p>這是我的意見:<code>{field1: {field2:'123', field3:{field4:'123'}}}</code></p> <p>目標是:<code>{field1: {update: {field2:'123', field3: {update: {field4:'123'}}</code></p> <p>這是我試過的:</p> <pre class="brush:php;toolbar:false;">function updateDictHelper(obj) { Object.entries(obj).reduce((updateClause = {}, [key, value]) => { if (typeof value !== 'object') { return {... updateClause, [key]: value} } else { return {... updateClause, [key]: {update: updateDictHelper(value)}} } }) }</pre> <p>然而,無論如何我都無法使其工作。我對java/typescript還很陌生,非常感謝任何幫助。 </p>
P粉423694341P粉423694341524 天前551

全部回覆(1)我來回復

  • P粉909476457

    P粉9094764572023-08-19 12:39:09

    您有兩個問題,第一個問題是您的updateDirectHelper函數沒有回傳任何內容。雖然在這個函數中有一個return語句,但實際上它是嵌套在reduce的回調函數(updateClause, [key, value]) => { 中,而不是updateDictHelper本身。

    您的另一個問題是如何為acc提供預設值。 Reduce原生支援可選的第二個參數,該參數將作為acc的初始值。

    reduce(callbackFn, initialValue)
    

    最好的做法是盡可能提供一個初始值。如果您不包含它,.reduce()將跳過回調的第一個調用,並從將acc設為數組中的第一個值開始調用回調函數,並將第二個參數設定為數組中的第二個值。如果您的陣列只有一個值,例如在您的情況下,那麼這個單一值就是從.reduce()呼叫中傳回的值,而您的.reduce()的回調函數將永遠不會被呼叫:

    const arrayWithOneElement = [1];
    const res = arrayWithOneElement.reduce(() => {
      console.log("I never run");
    }); // 注意没有第二个参数
    console.log(res);

    回覆
    0
  • 取消回覆