Фильтровать массив объектов, в котором массив одного объекта имеет хотя бы одно совпадение с другим массивом

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Заранее прошу прощения, не смог придумать лучшего примера для данных.

Итак, у меня есть массив things , который в настоящее время состоит только из объектов, содержащих id свойство, и массива, который просто содержит случайные вещи / слова, которые я мог бы внезапно придумать, и other_things , с некоторыми случайными словами из things массива.

 let things=[
  {
    id: 1,
    names: ['car','door','chair']
  },
  {
    id: 2,
    names: ['cat','dog','door']
  },
  {
    id: 3,
    names: ['phone','mouse','cat']
  },
  {
    id: 4,
    names: ['building','desk','pen']
  },
  {
    id: 5,
    names: ['road','date','number']
  }
];

let other_things=['car','door','pen']; 

Чего я хотел бы добиться, так это отфильтровать массив things и получить только те объекты / элементы, где names массив содержит хотя бы один элемент из other_things массива.

В этом примере только things[2] и things[4] не имеют совпадений ни с какими словами из other_things , поэтому они нам не нужны.

Я уже перепробовал много вещей, например, комбинирование методов ES6, например filter , every или map , пробовал использовать вложенные for циклы, но, к сожалению, у меня ничего не получилось.

Комментарии:

1. const other = { car: true, door: true, pen: true }; /* can be generated from array */ let result = things.filter(({ names }) => names.some(e => other[e] ?? false )); Если ваши предметы не являются строками, используйте вместо этого карту или просто сделайте что-нибудь дешевое, например includes , indexOf ither_things напрямую, если у вас есть в лучшем случае всего пара десятков или сотен предметов.

2. Tbh, для проверки структуры даже набора должно быть достаточно, вас не волнует порядок вставки или что-то в этом роде.

Ответ №1:

 let things=[
  {
    id: 1,
    names: ['car','door','chair']
  },
  {
    id: 2,
    names: ['cat','dog','door']
  },
  {
    id: 3,
    names: ['phone','mouse','cat']
  },
  {
    id: 4,
    names: ['building','desk','pen']
  },
  {
    id: 5,
    names: ['road','date','number']
  }
];

let other_things=['car','door','pen'];

console.log(things.filter(t => t.names.filter(n => other_things.includes(n)).length > 0))