Определить, различные ли данные в массиве объектов
есть массив выбранных элементов с 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('Нет совпадений')
Обернуть это всё в отдельную функцию не будет сложно, я думаю.
Исправление
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.
Я бы сделал так:
Создаём набор айдишников, чтобы не тратить время на поиски
Убираем все элементы, у которых
idнет в спискеids. filterСмотрим у всех ли элементов 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));