在forEach中向Immutable List添加元素

时间:2018-03-20 16:21:41

标签: immutable.js

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

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时,地图尚未更新。

1 个答案:

答案 0 :(得分:0)

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

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