javascript - 筛选项列表如何依赖于另一个列表
问题描述
我有一组脚本“列表”和一组选定的用户“用户”,每个用户可以有几个这样的脚本。
如何过滤“列表”脚本数组以仅将那些脚本用于正确的语句:
- 如果用户列表中的至少某人没有列表“列表”中的脚本,
我们将显示此脚本 - 如果所有用户都有这样的脚本,我们不会显示它
例子
let list = [{name: 'script1', id:'1'}, {name: 'script2',id:'2'},{name: 'script3',id:'3'}]
let users = [
{name: 'user1', scripts:[{name: 'script1',id:'1'}]},
{name: 'user2', scripts:[{name: 'script1',id:'1'},{name: 'script2',id:'2'}]}
]
let result = list.filter(...) //=> let list = [{name: 'script2'},{name: 'script3'}]
我的尝试看起来很糟糕
let result = list.filter(item => {
return users.filter(user => {
return user.scripts.some(el => {
return el.id !== item.id
})
})
})
解决方案
- 使用数组
Array#reduce
,users
创建一个作为脚本和作为Map
拥有它的数量key
id
value
users
Array#filter
在list
数组上使用,获取scripts
所有未使用users
的对象,然后,如果您只想返回name
使用的对象Array#map
const list = [
{ name: 'script1', id:'1' },
{ name: 'script2', id:'2' },
{ name: 'script3', id:'3' }
];
const users = [
{ name: 'user1', scripts:[ { name: 'script1', id:'1' } ] },
{ name: 'user2', scripts:[ { name: 'script1', id:'1' }, { name: 'script2', id:'2' } ] }
];
const TOTAL = users.length;
const usage = users.reduce((scriptUsagesMap, { scripts=[] }) => {
scripts.forEach(({ id }) => {
const count = scriptUsagesMap.get(id) || 0;
scriptUsagesMap.set(id, count + 1);
});
return scriptUsagesMap;
}, new Map);
const result = list
.filter(({ id }) => usage.get(id) !== TOTAL)
.map(({ name }) => ({ name }));
console.log(result);
推荐阅读
- apostrophe-cms - 将小部件限制在某个区域
- javascript - How to fix the undefined data when fetching the response data from https request?
- python - How to read a small percentage of lines of a very large CSV. Pandas - time series - Large dataset
- azure - 1 周和 1 个月内所有部署的报告
- javascript - 带参数的事件监听器
- excel - 返回每个月的总价值。VBA
- node.js - 在 res.send() 或 res.end() 之前重写或替换使用 res.write 发送的数据
- styling - 是否有可能让每个故事在故事书中都有自己的 CSS?
- java - ICU4J - 相同的货币符号作为前缀或后缀,取决于语言环境
- python - Visualizing a heatmap matrix on to an image in OpenCV