Определить, различные ли данные в массиве объектов

есть массив выбранных элементов с id [1,5] количество элементов может быть любым. Также есть массив с данными

const data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
]

Мне необходимо понять различный ли у этих элементов тип(type). Если различный вывести true иначе false. Мое решение

const id = [1,5]
const data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
]

function getValue( array, key) {
    return array.reduce(
        function( prev, item) {
          return ( !prev  &&  item.id == key) ? item.type : prev;
        },
        false
    );
}

const arrayType = id.map(value => getValue(data,value));

function duplicates(arr) {
    return new Set(arr).size !== 1;
}

console.log(duplicates(arrayType))

подскажите, может есть более короткое решение, без использования сторонних библиотек.


Ответы (3 шт):

Автор решения: Алексей Шиманский

let data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
];

let filteredData = data.filter(el => el.id === 1 || el.id === 5);

if (filteredData[0].type === filteredData[1].type)
  console.log('Совпадают')
else 
  console.log('Нет совпадений')

Обернуть это всё в отдельную функцию не будет сложно, я думаю.

→ Ссылка
Автор решения: ΝNL993

Исправление

const id = [1,5]
const data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
]

function notSameType(ids) {
  let types = []

  for (let i = 0; i < ids.length; i++) {
    let _id = ids[i]
    let obj = findObj(_id)

    if(types.includes(obj.type)) {
      return false
    }

    types.push(obj.type)
  }

  return true

  function findObj(id) {
    return data.find(e => e.id === id)
  }
}

console.log(notSameType(id)) // true
console.log(notSameType([1, 5])) // true
console.log(notSameType([3, 5])) // false
console.log(notSameType([1, 3, 5])) // false

Объяснение

Создаём массив types, в нём в будующем мы будем проверять уникальность других типов. Проходимся циклом for по массиву, находим нужный объект в массиве data, и проверяем его на уникальность, если уже существует, значит возвращаем false, а если не существует проходимся дальше, если все типы уникальны, значит возвращаем true.

Короткий ответ

Если вам уж так нравятся короткие ответы, то тогда вот :) (Чисто технически это всего одна строка)

P.S. @EzioMercer вне функции также использовал Set, так что прибавляем к нему +1 строку кода :p

const id = [1,5]
const data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
]

let notSameType = ids => !data
  .filter(e => ids.includes(e.id))
  .every((e, _, arr) => e.type === arr[0].type)


console.log(notSameType(id)) // true
console.log(notSameType([3, 5])) // false

Объяснение

Убираем все те объекты, которые не имеют id который есть в списке id. Дальше поверяем все ли type равняются этому типу, и далее используя оператор ! превращаем силой магии винкс все true в false, а все false в true, чтобы решение подходило к вопросу.

Оригинальный Ответ

let data = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
];

function notSameType(id1, id2) {
  let type1 = findObj(id1).type
  let type2 = findObj(id2).type
  
  return type1 !== type2

  function findObj(id) {
    return data.find(e => e.id === id)
  }
}

console.log(notSameType(1, 5)) // true
console.log(notSameType(3, 5)) // false

Объяснение

Находим объект у который пропорция id равна той, которую вы вводим в первый аргумент, далее берём из этого объекта пропорцию type, тоже самое со вторым объектом. Если они совпадают, возвращаем false, если не совпадают, возвращаем true.

→ Ссылка
Автор решения: EzioMercer

Я бы сделал так:

  1. Создаём набор айдишников, чтобы не тратить время на поиски

  2. Убираем все элементы, у которых id нет в списке ids. filter

  3. Смотрим у всех ли элементов type такой же как у первого. every

Код:

const ids = [1, 5];
const data1 = [
    {id:1,type:1},
    {id:3,type:2},
    {id:5,type:2},
];
const data2 = [
    {id:1,type:2},
    {id:3,type:2},
    {id:5,type:2},
];

const idsSet = new Set(ids);

const isSameType = (objects) =>
    objects
        // Убираем все элементы, у которых id нет в списке ids
        .filter(el => idsSet.has(el.id))
        // Смотрим у всех ли элементов type такой же как у первого
        .every((data, i, arr) => data.type === arr[0].type);

console.log(!isSameType(data1));
console.log(!isSameType(data2));

→ Ссылка