我想将新的键/值对添加到嵌套在另一个Map中的Map中。如果密钥已经存在,则应将其替换。
我认为mergeDeepIn()应该可以解决问题,但是出现“无效的keyPath”错误。
状态如下:
{
"requests":{
"1":{
"title":"I have a question",
"customerId":2,
"messages":{
"222":{
"text":"Hello!",
"senderId":1,
},
},
...
},
...
},
}
“请求”和“消息”是不可变的地图。
我尝试过:
const message = fromJS({
"5": {
text: "test",
},
})
state.mergeDeepIn(['requests', 1, 'messages'], message)
该消息应添加到“消息”地图中。
答案 0 :(得分:1)
不可移植性是数据结构的属性,它意味着:创建该数据结构后,它将永远不会再更改。在Map
中添加值或替换Map
意味着更改Map
,这正是immutable-js试图防止的。
您可以做的是从已经存在的const {Map} = require('immutable');
m = Map({a:1});
Map({...m.toJSON(), b:2}) // Map { "a": 1, "b": 2 }
Map({...m.toJSON(), a:2}) // Map { "a": 2 }
m.set('a', 2) // Map { "a": 2 } , creates a new map same as line above
中创建一个新的
private let colorPickerKey = "ColorPickerKey"
var selectedColor: UIColor? {
get {
guard let colorData = UserDefaults.standard.object(forKey: colorPickerKey) as? Data,
let color = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? UIColor else { return nil }
return color
} set {
guard let newValue = newValue else {
UserDefaults.standard.removeObject(forKey: colorPickerKey)
return
}
let colorData = NSKeyedArchiver.archivedData(withRootObject: newValue)
UserDefaults.standard.set(colorData, forKey: colorPickerKey)
}
}