Javascript 在不可变对象中添加具有键值对的新对象
这里有一个简单的测试,我已经写了我想做什么与一个不可变的对象Javascript 在不可变对象中添加具有键值对的新对象,javascript,immutable.js,Javascript,Immutable.js,这里有一个简单的测试,我已经写了我想做什么与一个不可变的对象 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, t
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]);
})
}
我已经尝试按照文档()替换value、key和iter来代替return newState.setIn(['data',key])
但是每次我都得到同样的回答
AssertionError:预期3等于{Object(大小,_根,…)}
有人能给我解释一下出了什么问题吗?这似乎是一项足够简单的任务,但我似乎正在努力处理不可变对象,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;
}
}
}
导出函数addtickereys(状态){
const tickerArray=state.get('tickers');
让newState=Map();
for(设i=0;i
如果其他人仍然有不同的答案,也许可以分享一个更优雅的内置解决方案。关于您的第一个解决方案的快速评论:
function addTickerKeys(state, tickers) {
return tickers.reduce((acc, ticker) => {
return acc.setIn([ 'data', ticker ], Map());
}, Map({
tickers: List(tickers),
}))
}
与Array.prototype
上的本机forEach
方法非常相似,不可变列表类型上的forEach
方法用于在列表的每次迭代时执行一些副作用。然而,两者之间的一个细微差别是,当回调函数在不可变的forEach
上返回false时,它将立即结束循环的执行,而本机forEach
是无止境的。这里,您在列表上使用了forEach
方法,但返回了一个值,这表明您可能将其与不可变类型和数组上的map
方法相混淆。不幸的是,map
也不是您想要的
现在,另一个解决方案是:
function addTickerKeys(state, tickers) {
return tickers.reduce((acc, ticker) => {
return acc.setIn([ 'data', ticker ], Map());
}, Map({
tickers: List(tickers),
}))
}