首页 > 解决方案 > 如何使用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数组。现在我需要找到tasksArray 中的所有对象,其中属性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数组只有一个选定的标签(总是相同的标签)。

请问有什么想法吗?

标签: javascriptarrayslodash

解决方案


一种方法是将您的 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可以单独完成。


推荐阅读