javascript - 如何使用lodash在内部数组包含其他对象的数组中查找对象
问题描述
我有以下数组:
const tasks = [
{id: 0, name: 'a', tags: [{id: 0, name: 'q'}, {id: 7, name: 'i'}]},
{id: 1, name: 'b', tags: [{id: 2, name: 'e'}, {id: 4, name: 't'}, {id: 2, name: 'e'}, {id: 0, name: 'q'}]},
{id: 2, name: 'c', tags: []},
{id: 3, name: 'd', tags: [{id: 7, name: 'i'}, {id: 3, name: 'r'}, {id: 0, name: 'q'}]},
{id: 6, name: 'g', tags: [{id: 7, name: 'i'}, {id: 4, name: 't'}]},
]
const tags = [
{id: 0, name: 'q'},
{id: 1, name: 'w'},
{id: 2, name: 'e'},
{id: 3, name: 'r'},
{id: 4, name: 't'},
{id: 7, name: 'i'},
{id: 11, name: 's'}
]
let selectedTags = [0, 5]
selectedTags
是 Array 的索引tags
数组。现在我需要找到tasks
Array 中的所有对象,其中属性tags
包括所有选定的标签。所以在这种情况下,输出应该是:
let result = [
{id: 0, name: 'a', tags: [{id: 0, name: 'q'}, {id: 7, name: 'i'}]},
{id: 3, name: 'd', tags: [{id: 7, name: 'i'}, {id: 3, name: 'r'}, {id: 0, name: 'q'}]}
]
我试图做这样的事情:
let result= []
_.forEach(selectedTags, index => {
const tagId = tags[index]._id
result = _.filter(tasks, task => _.find(task.tags, ['_id', tagId]))
})
但是result
数组包含的对象tags
数组只有一个选定的标签(总是相同的标签)。
请问有什么想法吗?
解决方案
一种方法是将您的 selectedTags 映射到等效的标签数组中。
接下来使用..every
确保 selectedTags 中的每个项目都存在于 tasks.tags 数组中some
。
下面的例子..
const tasks = JSON.parse('[{"id":0,"name":"a","tags":[{"id":0,"name":"q"},{"id":7,"name":"i"}]},{"id":1,"name":"b","tags":[{"id":2,"name":"e"},{"id":4,"name":"t"},{"id":2,"name":"e"},{"id":0,"name":"q"}]},{"id":2,"name":"c","tags":[]},{"id":3,"name":"d","tags":[{"id":7,"name":"i"},{"id":3,"name":"r"},{"id":0,"name":"q"}]},{"id":6,"name":"g","tags":[{"id":7,"name":"i"},{"id":4,"name":"t"}]}]');
const tags = JSON.parse('[{"id":0,"name":"q"},{"id":1,"name":"w"},{"id":2,"name":"e"},{"id":3,"name":"r"},{"id":4,"name":"t"},{"id":7,"name":"i"},{"id":11,"name":"s"}]');
let selectedTags = [0, 5];
const result = tasks.filter(f =>
selectedTags.map(m => tags[m]).every(
e => f.tags.some(s => s.id === e.id)));
console.log(result);
附言。如果性能是一个问题,map
可以单独完成。
推荐阅读
- c# - .NET 5 和 6 中的通用 try catch 方法 ASYNC:最先进的技术?
- javascript - TypeError:无法读取未定义/反应/打字稿的属性“画布”
- python - 如何访问在同一个类实例中的另一个def中的__init__中创建的变量?
- server - 创建 go-libp2p 出口网关
- c# - Entity Framework Core:模型的相关实体正在保存但不会加载
- javascript - 如何在 React 中不调用该组件的情况下将数据从一个组件发送到另一个组件?
- ios - 在 WindowGroup 中处理 Auth 状态
- python - 在python中使用正则表达式提取值
- vue.js - Vuejs - 当三个组件相互关联时避免道具变异的最佳方法
- flutter - 在颤振中我无法从下拉按钮更改值