【问题标题】:How to combine an array of JS objects with an existing immutable JS ordered map?如何将 JS 对象数组与现有的不可变 JS 有序映射组合?
【发布时间】:2019-12-14 07:53:42
【问题描述】:

在我的应用程序中,我异步获取结果并将它们作为不可变 JS 有序映射存储在 Redux 存储中。当我从 ajax 调用收到一个新的 JS 对象数组时,我想附加到这个有序映射。不知何故,我不认为将 OrderedMap 转换为 JS 然后连接结果是将新的 JS 对象合并到 OrderedMap 中的最佳性能方式。而且,我确信这是一个常见问题,但我找不到这个问题的答案。

【问题讨论】:

  • 我们在谈论多少项目?如果它不在 1000 年代和/或没有引起任何明显的问题,我不会担心过早优化。
  • 现在我只是将 JS 结果转换为 OrderedMap,然后合并两个 OrderedMap。我想不出更快的方法。

标签: javascript reactjs react-redux immutable.js


【解决方案1】:

我会这样做(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;
});

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多