9

Как удалить все дубликаты из массива объектов?

10

У меня есть объект, который содержит массив объектов. Вот пример кода:

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 ответ(ов)

2

Простой способ сделать это можно следующим образом:

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.

Если у вас есть дополнительные вопросы или требуется более детальное объяснение, не стесняйтесь спрашивать!

1

Если вы можете использовать библиотеки 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, что может быть более удобным способом для достижения той же цели.

0

Вам нужно преобразовать массив объектов в массив уникальных объектов по полю 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, чтобы получить массив значений, что дает нам нужный результат — массив объектов без дубликатов.

0

Чтобы удалить все дубликаты из массива объектов, самым простым способом будет воспользоваться методом 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. Таким образом, в результате мы получаем массив без дубликатов.

0

Вот еще один вариант решения вашей задачи с использованием методов итерации массивов, если вам нужно сравнение только по одному полю объекта:

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, мы проходим по каждому элементу и проверяем, встречается ли его значение по указанному полю в массиве до текущей позиции. Если элемент является уникальным, он будет включен в результирующий массив.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь