如何将JS对象数组与现有的不可变JS有序映射相结合?

时间:2019-08-06 17:47:41

标签: javascript reactjs react-redux immutable.js

在我的应用程序中,我异步获取结果并将其作为Immutable JS有序映射存储在Redux存储中。当我从ajax调用接收到新的JS对象数组时,我想附加到此有序映射。以某种方式,我不认为将OrderedMap转换为JS,然后将结果串联是将新JS对象合并到OrderedMap中的最佳性能方法。而且,我敢肯定这是一个普遍的问题,但是我找不到这个问题的答案。

1 个答案:

答案 0 :(得分:0)

我会这样做(merge可以采用键/值对数组):

const keyValuePairsArray = newItemsArray.map(item => [getKey(item), item]);

const myNewMap = myExistingMap.merge(keyValuePairsArray);

另一种选择是创建一个对象而不是一个键-值对数组,但是我认为这比较丑陋:

const newItemsPojo = newItemsArray.reduce((obj, item) => {
    obj[getKey(item)] = item;
    return obj;
}, {});

const myNewMap = myExistingMap.merge(newItemsPojo);

高性能选项是使用withMutations(这是merge的主要作用),但是我认为它使可读性最低的代码变得不那么快,还有关于如何使用withMutations的特殊规则:

const myNewMap = myExistingMap.withMutations(existing => {

    const newMap = existing;

    newItemsArray.forEach(item => {
        newMap.set(getKey(item), item);
    });

    return newMap;
});