Задать вопрос
@antimodern

Как красиво выбрать элементы из массива по второму массиву?

Есть ли какой-то one-liner чтобы выбрать из массива только те элементы, которые содержатся во втором массиве?

const tags = [
  {
    id: 1,
    name: 'one'
  },
  {
    id: 2,
    name: 'two'
  },
  {
    id: 3,
    name: 'three'
  },
  {
    id: 4,
    name: 'four'
  }
]

const active = [
  {
    name: 'one'
  },
  {
    name: 'four'
  }
]
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Если делать ровно то, что спрошено, тогда

tags.filter(n => active.some(m => m.name === n.name))

// или

active.flatMap(function(n) {
  return this.get(n.name) || [];
}, new Map(tags.map(n => [ n.name, n ])))

Но можно решить задачу и в чуть более общем виде:

function intersection(data1, data2, key = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const keys = new Set(Array.from(data2, getKey));
  return Array.prototype.filter.call(data1, n => keys.has(getKey(n)));
}

// ваш случай
intersection(tags, active, 'name')

// есть и другие варианты применения
intersection([ 69, 187, 666 ], [ 0, 1, 2, 3, 187 ]) // [187]
intersection('aBCdE', 'bDfHj', n => n.toLowerCase()) // ['B', 'd']
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы