Найти одинаковые значения в массиве объектов
Есть массив объектов типа:
let data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: false },
{ id: 4, page: 3, duplicate: false },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: false },
{ id: 7, page: 5, duplicate: false },
{ id: 8, page: 6, duplicate: false }]
Не могу решить 2 задачи:
- Нужно найти все одинаковые значения "page" и изменить "duplicate" на true, то есть у объектов с ID = 3, 4, 6 и 7, значения ключа "duplicate" сделать равным true.
- Создать новый массив со списком ID имеющих дубликаты, т.е.: [3, 4, 6, 7]
В итоге получить надо два массива:
Первый (изменённый исходный):
data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: true },
{ id: 4, page: 3, duplicate: true },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: true },
{ id: 7, page: 5, duplicate: true },
{ id: 8, page: 6, duplicate: false }
]
Второй, новый со списком ID:
duplicateIds = [3,4,6,7]
Ответы (4 шт):
Автор решения: Проста Miha
→ Ссылка
Возможно можно сделать намного проще, но это то на что я пока что способен ^-^
Надеюсь помог
let data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: false },
{ id: 4, page: 3, duplicate: false },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: false },
{ id: 7, page: 5, duplicate: false },
{ id: 8, page: 6, duplicate: false }];
let duplicateIds = [],
temp = 0;
for (let i = 0; i < data.length; i++) {
for (let j = i + 1; j < data.length; j++) {
if (data[i]['page'] == data[j]['page']) {
data[i]['duplicate'] = true;
data[j]['duplicate'] = true;
duplicateIds .push(data[i]['id'], data[j]['id']);
}
}
}
console.log(data);
console.log(duplicateIds );
Автор решения: Qwertiy
→ Ссылка
Линейное решение:
let data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: false },
{ id: 4, page: 3, duplicate: false },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: false },
{ id: 7, page: 5, duplicate: false },
{ id: 8, page: 6, duplicate: false },
]
let count = Object.create(null)
let used = new Set()
for (let {page} of data) {
if ((count[page] = ~~count[page] + 1) == 2) {
used.add(page)
}
}
let dups = []
for (let x of data) {
if (used.has(x.page)) {
x.duplicate = true
dups.push(x.id)
}
}
console.log(dups)
console.log(data)
.as-console-wrapper.as-console-wrapper { max-height: 100vh }
Автор решения: Pavel Nazarian
→ Ссылка
let data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: false },
{ id: 4, page: 3, duplicate: false },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: false },
{ id: 7, page: 5, duplicate: false },
{ id: 8, page: 6, duplicate: false }
];
let duplicateIds = [];
let new_data = data.map((e,i,a) => {
if (a.filter((_,ind) => i != ind).some(item => item.page === e.page)) {
duplicateIds.push(e.id);
e.duplicate = true;
return e;
} else return e;
});
console.log(new_data);
console.log(duplicateIds);
Автор решения: novvember
→ Ссылка
const data = [
{ id: 1, page: 1, duplicate: false },
{ id: 2, page: 2, duplicate: false },
{ id: 3, page: 3, duplicate: false },
{ id: 4, page: 3, duplicate: false },
{ id: 5, page: 4, duplicate: false },
{ id: 6, page: 5, duplicate: false },
{ id: 7, page: 5, duplicate: false },
{ id: 8, page: 6, duplicate: false }]
const duplicateIds = [];
// Считаем, что data предварительно упорядочен по возрастанию page
data.forEach( function(object, position, array) {
if (position !== array.length - 1 && object.page === array[position + 1].page) {
object.duplicate = true;
array[position + 1].duplicate = true;
}
if (object.duplicate === true) duplicateIds.push(object.id);
});
console.log(data);
console.log(duplicateIds);