TL; 博士
如何簡化此代碼,以便store.user[userId].order[orderId].items僅指定一次長屬性名稱?
if (!store.user[userId].order[orderId].items) store.user[userId].order[orderId].items = new Set();
if (store.user[userId].order[orderId].items.has('apples')) store.user[userId].order[orderId].items.add('oranges');
細節
我有一個很長的物件屬性,這使得代碼難以閱讀。我想使用一個變數作為別名來簡化代碼,如下所示:
let items = store.user[userId].order[orderId].items;
if (items.has('apples')) items.add('oranges');
但是,如果尚未設定該屬性,則會出現錯誤。所以我需要定義一個默認物件:
let items = store.user[userId].order[orderId].items || new Set();
if (items.has('apples')) items.add('oranges');
然而,雖然這適用于現有物件,但如果new Set()被呼叫,那么我仍然需要將新實體放回冗長的物件中以保持它:
let items = store.user[userId].order[orderId].items || new Set();
if (!store.user[userId].order[orderId].items) store.user[userId].order[orderId].items = items;
if (items.has('apples')) items.add('oranges');
哪一種違背了目的。
有沒有辦法可以使用此變數作為較長屬性的別名,同時在屬性尚不存在的情況下提供和設定默認值,但這樣我只需要指定一次長屬性名稱?
雖然我的示例案例有點人為,但我在回圈資料時經常遇到這種情況。每次迭代都會運行相同的代碼,但是當它遇到不同的傳入資料時,它需要添加到現有結構中,或者如果它們尚不存在就創建它們 - 所以預先創建所有屬性并不是一個真正的選擇,因為你不這樣做在處理資料之前不知道要創建哪些屬性。
uj5u.com熱心網友回復:
如果您正在訪問可能嵌套在可選 undefined 中的物件,請使用此方法。
要設定空合并(如果變數為 null 或未定義則輸入一個值),請使用以下命令:
let a = bla.bla.mightByNullOrUndefined?.obj?.nested
a ??= somethingElse
uj5u.com熱心網友回復:
可選鏈接是一種參考可能不存在于幾個級別上的物件的方法。
錯誤“無法正確讀取......未定義”正是如此。
用法:
const obj = bla.bla.mightNotExist?.innerObj?.items?.length
這樣,代碼將停止在內部嵌套并且不會拋出錯誤。
現在只需根據目標添加您的邏輯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347638.html
標籤:javascript
上一篇:這里如何使用解構?
下一篇:如何洗掉重復的物件并排序?
