[英]In Javascript, how to conditionally update a property of an object?
我已經看過這篇文章 ,並想知道是否有一種方法可以使用javascript編寫一個函數,可以通過使用具有新值的另一個對象來有條件地更新對象的所有屬性?
說我有這個對象:
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
我想使用另一個對象傳遞的屬性更新其值,如下所示:
let newObj = {test2: 'newValue2'}
在這種情況下,我只想更新屬性“test2”。 如果我知道我要更新的屬性並且我事先知道原始屬性,我將使用:
oldObj = {
...(newObj.test1) && {test1: newObj.test1} || {test1: oldObj.test1},
...(newObj.test2) && {test2: newObj.test2} || {test2: oldObj.test2},
...(newObj.test3) && {test3: newObj.test3} || {test3: oldObj.test3},
};
意思是我只會在屬性進入新對象時更新值,但當然我必須添加與對象中的屬性一樣多的條件。
這種方法很好,但它沒有推廣,所以如果對象有10個屬性,我將不得不寫出10個條件。
有沒有辦法編寫一個可以有條件地更新屬性的函數,這樣我就不必編寫10個(或更多)條件?
你在評論中說過:
我將只更新舊對象中存在的屬性,不會添加舊對象中不存在的新屬性。
這意味着我們必須將spread語法和Object.assign
保留在圖片之外,因為它們都會將newObj
所有屬性復制到oldObj
。
相反,我們可以使用一個簡單的循環(如果這出現了很多,你可以創建一個函數,也許是updateObject
):
for (const key of Object.keys(newObj)) {
if (key in oldObj) {
oldObj[key] = newObj[key];
}
}
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' }; let newObj = {test2: 'newValue2', xyz: "don't copy me"}; for (const key of Object.keys(newObj)) { if (key in oldObj) { oldObj[key] = newObj[key]; } } console.log(oldObj);
(您可能更喜歡oldObj.hasOwnProperty(key)
而不是key in oldObj
的key in oldObj
,具體取決於您的更新規則。)
或者使用相對較新的Object.entries
和一些解構:
for (const [key, value] of Object.entries(newObj)) {
if (key in oldObj) {
oldObj[key] = value;
}
}
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' }; let newObj = {test2: 'newValue2', xyz: "don't copy me"}; for (const [key, value] of Object.entries(newObj)) { if (key in oldObj) { oldObj[key] = value; } } console.log(oldObj);
在上面引用的澄清之前,我發布了以下關於spread和Object.assign
。 只是為了完整性,但它們不適用於您想要跳過oldObj
沒有的屬性的情況:
你不必像傳播語法一樣復雜,只需:
oldObj = {...oldObj, ...newObj};
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' }; let newObj = {test2: 'newValue2', xyz: "I get copied too"}; oldObj = {...oldObj, ...newObj}; console.log(oldObj);
這將創建一個包含所有oldObj
和newObj
屬性的新對象,如果兩者具有相同的名稱,則newObj
的屬性將獲勝。
請注意,物業價差是全新的 ,只是批准到第4階段(將在ES2018規范中)。 如果您不想使用Stage 4提案,請使用Object.assign
:
oldObj = Object.assign({}, oldObj, newObj);
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' }; let newObj = {test2: 'newValue2', xyz: "I get copied too"}; oldObj = Object.assign({}, oldObj, newObj); console.log(oldObj);
如果要在原位更新oldObj
而不是創建新對象,也可以使用Object.assign
:
Object.assign(oldObj, newObj);
let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' }; let newObj = {test2: 'newValue2', xyz: "I get copied too"}; Object.assign(oldObj, newObj); console.log(oldObj);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.