Удалить дубликаты из массива объектов в JavaScript - PullRequest
260 голосов
/ 08 февраля 2010

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

things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

Мне интересно, как лучше всего удалять дубликаты объектов из массива. Так, например, вещи стали бы ...

{place:"here",name:"stuff"},
{place:"there",name:"morestuff"}

Ответы [ 46 ]

0 голосов
/ 25 июня 2019

SHORTEST ONE LINER

Поиск уникальных идентификаторов в массиве.

arr.filter((v,i,a)=>a.findIndex((t)=>(t.id === v.id))===i)

Уникальный для нескольких свойств (идентификатор и имя)

arr.filter((v,i,a)=>a.findIndex((t)=>(t.id === v.id && t.name===v.name))===i)
0 голосов
/ 18 апреля 2019

Сделай что-нибудь простое. Фантазия хороша, но нечитаемый код бесполезен. Наслаждайтесь: -)

var a = [
	{
		executiveId: 6873702,
		largePhotoCircle: null,
		name: "John A. Cuomo",
		photoURL: null,
		primaryCompany: "VSE CORP",
		primaryTitle: "Chief Executive Officer, President and Director"
	},
	{
		executiveId: 6873702,
		largePhotoCircle: null,
		name: "John A. Cuomo",
		photoURL: null,
		primaryCompany: "VSE CORP",
		primaryTitle: "Chief Executive Officer, President and Director"
	},
	{
		executiveId: 6873703,
		largePhotoCircle: null,
		name: "John A. Cuomo",
		photoURL: null,
		primaryCompany: "VSE CORP",
		primaryTitle: "Chief Executive Officer, President and Director",
	}
];

function filterDuplicate(myArr, prop) {
      // Format - (1)

      // return myArr.filter((obj, pos, arr) => {
      //     return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
      // });

      // Format - (2)
      var res = {};
      var resArr = [];
      for (var elem of myArr) {
        res[elem.executiveId] = elem;
      }
      for (let [index, elem] of Object.entries(res)) {
        resArr.push(elem);
      }
      return resArr;
  }
  
let finalRes = filterDuplicate(a,"executiveId");
console.log("finalResults : ",finalRes);
0 голосов
/ 02 сентября 2018
  • Это решение является общим для любого типа объектов и проверяет каждый (key, value) из Object в массиве.
  • Использование временного объекта в качестве хеш-таблицы, чтобы увидеть, присутствовал ли когда-либо весь Object в качестве ключа.
  • Если найдено строковое представление Object, то этот элемент удаляется из массива.

var arrOfDup = [{'id':123, 'name':'name', 'desc':'some desc'},
                {'id':125, 'name':'another name', 'desc':'another desc'},
                {'id':123, 'name':'name', 'desc':'some desc'},
                {'id':125, 'name':'another name', 'desc':'another desc'},
                {'id':125, 'name':'another name', 'desc':'another desc'}];

function removeDupes(dupeArray){
  let temp = {};
  let tempArray = JSON.parse(JSON.stringify(dupeArray));
  dupeArray.forEach((item, pos) => {
    if(temp[JSON.stringify(item)]){
      tempArray.pop();
    }else{
      temp[JSON.stringify(item)] = item;
    }
  });
 return tempArray;
}

arrOfDup = removeDupes(arrOfDup);

arrOfDup.forEach((item, pos) => {
  console.log(`item in array at position ${pos} is ${JSON.stringify(item)}`);
});
0 голосов
/ 27 июня 2017

Другим способом было бы использовать функцию Reduce и иметь новый массив, чтобы быть аккумулятором. Если в массиве аккумуляторов уже есть thing с таким именем, не добавляйте его туда.

let list = things.thing;
list = list.reduce((accumulator, thing) => {
    if (!accumulator.filter((duplicate) => thing.name === duplicate.name)[0]) {
        accumulator.push(thing);
    }
    return accumulator;
}, []);
thing.things = list;

Я добавляю этот ответ, потому что я не смог найти хорошее, удобочитаемое решение es6 (я использую babel для работы со стрелками), которое совместимо с Internet Explorer 11. Проблема в том, что IE11 не имеет Map.values() или Set.values() без полизаполнения. По той же причине я использовал filter()[0], чтобы получить первый элемент вместо find().

0 голосов
/ 10 октября 2016

Вот решение, использующее новую функцию фильтрации JavaScript, которая довольно проста. Допустим, у вас есть такой массив.

var duplicatesArray = ['AKASH','AKASH','NAVIN','HARISH','NAVIN','HARISH','AKASH','MANJULIKA','AKASH','TAPASWENI','MANJULIKA','HARISH','TAPASWENI','AKASH','MANISH','HARISH','TAPASWENI','MANJULIKA','MANISH'];

Функция фильтра позволит вам создать новый массив, используя функцию обратного вызова один раз для каждого элемента в массиве. Таким образом, вы можете настроить уникальный массив следующим образом.

var uniqueArray = duplicatesArray.filter(function(elem, pos) {return duplicatesArray.indexOf(elem) == pos;});

В этом сценарии ваш уникальный массив будет проходить через все значения в дублирующем массиве. Переменная elem представляет значение элемента в массиве (mike, james, james, alex), позиция - это позиция с 0 индексами в массиве (0,1,2,3 ...) и duplicatesArray. Значение indexOf (elem) - это просто индекс первого вхождения этого элемента в исходном массиве. Таким образом, поскольку элемент 'james' дублируется, когда мы перебираем все элементы в duplicatesArray и помещаем их в uniqueArray, при первом обращении к james наше значение pos равно 1, а наш indexOf (elem) равно 1, так что Джеймса выталкивают в uniqueArray. Во второй раз, когда мы нажимаем на Джеймса, наше значение "pos" равно 2, а наш indexOf (elem) по-прежнему равен 1 (потому что он находит только первый экземпляр элемента массива), поэтому дубликат не выдвигается. Поэтому наш uniqueArray содержит только уникальные значения.

Здесь приведена демонстрация вышеуказанной функции. Нажмите здесь, чтобы посмотреть пример функции выше

0 голосов
/ 19 июня 2018
function filterDuplicateQueries(queries){
    let uniqueQueries = [];
     queries.forEach((l, i)=>{
        let alreadyExist = false;
        if(uniqueQueries.length>0){
            uniqueQueries.forEach((k, j)=>{
                if(k.query == l.query){
                    alreadyExist = true;
                }
            });
        }
        if(!alreadyExist){
           uniqueQueries.push(l)
        }
    });
0 голосов
/ 19 марта 2019

Вы можете использовать Object.values ​​() в сочетании с Array.prototype.reduce () :

const things = new Object();

things.thing = new Array();

things.thing.push({place:"here",name:"stuff"});
things.thing.push({place:"there",name:"morestuff"});
things.thing.push({place:"there",name:"morestuff"});

const result = Object.values(things.thing.reduce((a, c) => (a[`${c.place}${c.name}`] = c, a), {})); 

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 22 декабря 2016

Если вам нужен уникальный массив, основанный на нескольких свойствах объекта, вы можете сделать это с помощью карты и комбинировать свойства объекта.

    var hash = array.map(function(element){
        var string = ''
        for (var key in element){
            string += element[key]
        }
        return string
    })
    array = array.filter(function(element, index){
        var string = ''
        for (var key in element){
            string += element[key]
        }
        return hash.indexOf(string) == index
    })
0 голосов
/ 05 июня 2017

Общий для любого массива объектов:

/**
* Remove duplicated values without losing information
*/
const removeValues = (items, key) => {
  let tmp = {};

  items.forEach(item => {
    tmp[item[key]] = (!tmp[item[key]]) ? item : Object.assign(tmp[item[key]], item);
  });
  items = [];
  Object.keys(tmp).forEach(key => items.push(tmp[key]));

  return items;
}

Надеюсь, это может кому-нибудь помочь.

0 голосов
/ 21 ноября 2017
 var testArray= ['a','b','c','d','e','b','c','d'];

 function removeDuplicatesFromArray(arr){

 var obj={};
 var uniqueArr=[];
 for(var i=0;i<arr.length;i++){ 
    if(!obj.hasOwnProperty(arr[i])){
        obj[arr[i]] = arr[i];
        uniqueArr.push(arr[i]);
    }
 }

return uniqueArr;

}
var newArr = removeDuplicatesFromArray(testArray);
console.log(newArr);

Output:- [ 'a', 'b', 'c', 'd', 'e' ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...