【问题标题】:Adding elements to Immutable List within forEach在 forEach 中将元素添加到不可变列表
【发布时间】:2018-08-29 13:41:33
【问题描述】:

我有一个不可变映射,其中每个键都是一个任意类别(这些将是一个列表)。然后我有一个每个类别必须有的字符串数组。如果特定类别不包含该字符串,则会将其添加到地图内的相应列表中。

const categories = new Map({
    cat1: new List(['animal', 'color']),
    cat2: new List(['animal']),
});

const missingKeys = new Map({
    cat1: new List(),
    cat2: new List(),
});

categories.keySeq().toArray().forEach((category) => {
    const keys = categories.get(category).keySeq().toArray();
    const requiredKeys = ['animal', 'color'];
    // loop through required keys and push any key that is not found
    // in the categories Map
    requiredKeys.forEach((key) => {
        if (keys.indexOf(key) === -1) {
            // add missing keys to respective category of `missingKeys`
            missingKeys.get(category).push(key)
        }
    });
});

我希望循环完成后,categories 会相应更新。但是,当我尝试 console.log categories 时,地图还没有更新。

【问题讨论】:

    标签: immutable.js


    【解决方案1】:

    您似乎错过了这个库的整个“不可变”部分。线

    missingKeys.get(category).push(key)
    

    不会改变 missingKeys 或它包含的任何列表。它返回一个新的List,最后缺少键。 如果你想让missingKeys改变,你需要重新分配变量:

    missingKeys = missingKeys.update(category, keyList => keyList.push(key));
    

    别忘了改变它


    顺便说一句,您使用keySeqtoArray 进行了很多奇怪的转换。你所拥有的可以更简单地写成:

    const requiredKeys = ['animal', 'color'];
    categories.forEach((keys, category) => {
      requiredKeys.forEach(requiredKey => {
        if (!keys.contains(key)) {
          missingKeys = missingKeys.update(category, keyList => keyList.push(key));
        }
      });
    });
    

    或者更惯用的函数式方式:

    const requiredKeys = List(['animal', 'color']);
    const missingKeys = categories.map(keys =>
      requiredKeys.filter(key =>
        !keys.contains(key)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 2012-09-06
      • 1970-01-01
      • 2015-12-16
      • 2021-12-25
      • 2014-06-16
      相关资源
      最近更新 更多