[英]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.