簡體   English   中英

JavaScript對象分配

[英]JavaScript object assign

我試圖在不覆蓋現有屬性的情況下更新深度嵌套的對象,但是找不到一種優雅的方式來做到這一點,例如:

const data = {
  items: {
    one: {
      active: false,
      id: '123'
    },
    two: {
      active: true
    }
  }
}

const updatedData = {
  items: {
     one: {
        active: true
     }
  }
}

最終結果應為:

{
  items: {
    one: {
      active: true,
      id: '123'
    },
    two: {
      active: true
    }
  }
}

但是,使用Object.assign或spread運算符將只用{active: true}替換items.one而不保留id 有沒有一種方法可以不遞歸地遍歷對象?

   function merge(source, into) {
     for(let key in into){
       if(typeof into[key] === "object") {
         merge(source[key] || (source[key] = {}), into[key]);
       } else {
         source[key] = into[key];
      }
   }
 }

遞歸函數使其非常簡單。 迭代新數據的屬性。 如果屬性的目標和源都引用了一個對象,則用兩個對象遞歸調用該函數。 否則,只需將源值分配給目標值。

 const data = { items: { one: { active: false, id: '123' }, two: { active: true } } } const updatedData = { items: { one: { active: true } } } updateWith(data, updatedData); console.log(data); function updateWith(target, newData) { for (const [k, v] of Object.entries(newData)) { if (typeof v === "object" && typeof target[k] === "object") { updateWith(target[k], v); } else { target[k] = v; } } } 

假定您引用了一個任意的data.items[key]對象,則可以執行以下操作:

data.items[key] = Object.assign({}, data.items[key], updatedData.items[key]);

上面的代碼將用舊的對象值替換舊的對象值,並從原始對象中復制屬性,並最終替換更新數據提供的所有屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM