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),
  }))
}