我有一个不可变映射,其中每个键是一个任意类别(这些将是一个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
时,地图尚未更新。
答案 0 :(得分:0)
你似乎错过了这个库的整个“不可变”部分。这条线
missingKeys.get(category).push(key)
不会改变missingKeys
或其中包含的任何列表。它返回一个新的List
,最后带有缺少的键。
如果您想要更改missingKeys
,则需要重新分配变量:
missingKeys = missingKeys.update(category, keyList => keyList.push(key));
别忘了改变
作为旁注,您正在使用keySeq
和toArray
进行大量奇怪的转化。你所拥有的东西可以简单地写成:
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)))