Как удалить все дубликаты из массива объектов?
У меня есть объект, который содержит массив объектов. Вот пример кода:
obj = {};
obj.arr = new Array();
obj.arr.push({place: "here", name: "stuff"});
obj.arr.push({place: "there", name: "morestuff"});
obj.arr.push({place: "there", name: "morestuff"});
Я пытаюсь найти лучший метод для удаления дубликатов объектов из массива. Например, массив obj.arr
должен выглядеть следующим образом после удаления дубликатов:
{place: "here", name: "stuff"},
{place: "there", name: "morestuff"}
Как я могу это сделать?
5 ответ(ов)
Простой способ сделать это можно следующим образом:
const obj = {};
for (let i = 0, len = things.thing.length; i < len; i++) {
obj[things.thing[i]['place']] = things.thing[i];
}
things.thing = new Array();
for (const key in obj) {
things.thing.push(obj[key]);
}
Данный код создает объект obj
, в котором ключами являются значения свойства place
из массива things.thing
, а значениями — сами элементы массива. Затем мы очищаем массив things.thing
и заполняем его значениями из объекта obj
. В результате массив things.thing
будет содержать уникальные элементы, сгруппированные по значению place
.
Если у вас есть дополнительные вопросы или требуется более детальное объяснение, не стесняйтесь спрашивать!
Если вы можете использовать библиотеки JavaScript, такие как underscore или lodash, я настоятельно рекомендую обратить внимание на функцию _.uniq
в их библиотеках. В lodash
она выглядит следующим образом:
_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])
В основном, вы передаете массив, в данном случае это объект в виде литерала, и указываете атрибут, по которому хотите удалить дубликаты в исходном массиве данных, например так:
var data = [{'name': 'Amir', 'surname': 'Rahnama'}, {'name': 'Amir', 'surname': 'Stevens'}];
var non_duplidated_data = _.uniq(data, 'name');
UPDATE: В Lodash теперь также доступна функция .uniqBy
, что может быть более удобным способом для достижения той же цели.
Вам нужно преобразовать массив объектов в массив уникальных объектов по полю id
, используя ES6? Вот один из способов сделать это в одну строку:
let arr = [
{id:1, name:"sravan ganji"},
{id:2, name:"pinky"},
{id:4, name:"mammu"},
{id:3, name:"avy"},
{id:3, name:"rashni"},
];
console.log(Object.values(arr.reduce((acc, cur) => Object.assign(acc, {[cur.id]: cur}), {})));
Этот фрагмент кода использует метод reduce
, чтобы собрать объекты в аккумуляторе acc
на основе уникальных идентификаторов id
. Мы используем Object.assign
для добавления текущего объекта по его id
в аккумулятор. В конце мы применяем Object.values
, чтобы получить массив значений, что дает нам нужный результат — массив объектов без дубликатов.
Чтобы удалить все дубликаты из массива объектов, самым простым способом будет воспользоваться методом filter
:
var uniq = {};
var arr = [{"id":"1"}, {"id":"1"}, {"id":"2"}];
var arrFiltered = arr.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
console.log('arrFiltered', arrFiltered);
В данном примере мы создаем пустой объект uniq
, который будет использоваться для отслеживания уже встреченных идентификаторов. Метод filter
проверяет, есть ли id
текущего объекта в uniq
. Если его нет, мы добавляем его в uniq
и сохраняем объект в arrFiltered
. Таким образом, в результате мы получаем массив без дубликатов.
Вот еще один вариант решения вашей задачи с использованием методов итерации массивов, если вам нужно сравнение только по одному полю объекта:
function uniq(a, param) {
return a.filter(function(item, pos, array) {
return array.map(function(mapItem) { return mapItem[param]; }).indexOf(item[param]) === pos;
});
}
uniq(things.thing, 'place');
Этот код позволяет отфильтровать массив объектов a
, оставляя только уникальные элементы по заданному полю param
. Используя метод filter
, мы проходим по каждому элементу и проверяем, встречается ли его значение по указанному полю в массиве до текущей позиции. Если элемент является уникальным, он будет включен в результирующий массив.
Проверка наличия ключа в объекте JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Самый эффективный способ группировки массивов объектов
Как объединить два массива в JavaScript и удалить дубликаты?
Почему null является объектом и в чем разница между null и undefined?