这是我写的一个简单测试,说明我想用不可变对象(immutable对象)做什么
it('adds a new map with loaded data where the key is the ticker symbol', () => {
const state = Map();
const tickers = List.of('AAPL', 'TSLA', 'GOOGL');
const nextState = addTickerKeys(state, tickers);
expect(nextState).to.equal(fromJS({
tickers: ['AAPL', 'TSLA', 'GOOGL'],
data: {
AAPL: {},
TSLA: {},
GOOGL: {}
}
}));
})
如何将数据对象和对应的空数据的键添加到状态对象中?
这是我目前的尝试
export function addTickerKeys(state, tickers) {
const newState = setTickers(state, tickers);
const tickerList = newState.get('tickers');
return tickerList.forEach((value, key, iter) => {
return newState.setIn(['data', key]);
})
}
我已经尝试根据文档 ( https://facebook.github.io/immutable-js/docs/#/Map/set ) 替换值、键和迭代器来代替 return newState.setIn(['data', key])
但是,我每次都得到相同的回复,
AssertionError: expected 3 to equal { Object (size, _root, ...) }
有人可以向我解释发生了什么问题吗?这似乎是一项足够简单的任务,但我似乎在与不可变对象(immutable对象)作斗争,TypeScript 中的文档也无济于事。
最佳答案
这是我刚刚想出的一个快速答案。
Immutable 似乎没有用于此任务的强大内置函数,而且您必须从纯函数返回状态的方式令人沮丧。
这是添加对象键值对的快速而粗略的解决方案。
export function addTickerKeys(state) {
const tickerArray = state.get('tickers');
let newState = Map();
for(let i = 0; i < tickerArray.size; i++){
ctr++;
newState = state.setIn(['data', tickerArray.get(i)], Map());
state = state.concat(newState);
if(i === tickerArray.size - 1){
return state;
}
}
}
如果其他人仍然有不同的答案,可能会分享更优雅的内置解决方案。
关于javascript - 在不可变对象(immutable对象)中添加具有键值对的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40846782/