[英]Redux Reducer - How to update an object value without mutating the state?
[英]How to manipulate attributes of an object passed to a function without mutating the state
我想知道是否可以更改傳遞給函數的對象的屬性,而無需改變對象的狀態。
像這樣:
function startOfLine(options) {
options.someProp = += 'startOfLine';
return options;
}
function otherFunction(options) {
// do something with options and...
return options;
}
const options = startOfLine(otherFunction({
somePro: '',
someProp2: ''
}));
我將以動態方式創建函數的執行,這就是為什么我不必擔心嵌套20個級別的調用的原因。
謝謝。
當您想用功能語言更新對象時,通常的方法是返回具有某些屬性更改的對象的新克隆版本(無需修改原始對象)。 我認為沒有內置的方法可以在JavaScript中克隆對象,但是本文提供了詳細的答案 。 使用該答案中的clone
功能,您可以編寫:
function startOfLine(options) {
var newOptions = clone(options);
newOptions.someProp = 'startOfLine';
return newOptions;
}
當您擁有對象o1
並編寫var o2 = startOfLine(o1)
您將獲得一個具有startOfLine
設置但不startOfLine
o1
的新對象o2
。
如果您不打算在任何地方更改對象,則可以執行淺表復制(並避免克隆整個對象樹),但是仍然涉及一些開銷-但是您獲得了使用不可變對象的良好屬性,這些屬性通常會增加成本。
不幸的是,我沒有足夠的聲譽來發表評論。 因此,嘗試基於一些合理的假設進行回答。
您正在尋找一種方法,可以更好地鏈接與單個對象相關的某些操作,從而避免過多的突變或創建新對象。 最終對象應該是具有應用轉換的同一對象(或副本?)。
如果這是您要尋找的對象,則可以通過使用哈希樹來實現良好的內存效率。 您可以參考Facebook的immutable.js庫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.