Удалить дубликат объекта из массивов объекта через имя ключа - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующие массивы объектов:

var arr = [
  {name: 'rajendra', last: 'arora'},
  {name: 'rajendra', last: 'arora2'},
  {name: 'rajendra1', last: 'arora22'},
  {name: 'rajendra2', last: 'arora233'},
  {name: 'rajendra2', last: 'arora23'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendr3', last: 'arora3'}
]

Я хочу удалить дубликаты объектов через имя ключа name.Мой ожидаемый результат:

var arr = [
  {name: 'rajendra', last: 'arora'},
  {name: 'rajendra1', last: 'arora22'},
  {name: 'rajendra2', last: 'arora233'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendr3', last: 'arora3'}
]

Я попробовал ниже следующую программу:

function _unique(arr) {
  let uniqueArr = [];

  for (var i = 0; i < arr.length; i++) {
    for(var j=i+1; j<arr.length; j++) {
      if(arr[i].name.indexOf(arr[j].name) == -1) {
        uniqueArr.push(arr[j])
      }
    }
  }
  // console.log(uniqueArr[0].name.indexOf("rajendra"))
  return uniqueArr;
}

console.log(_unique(arr))

Но она не работает.

ПОМОГИТЕ БЫТЬБУДЬТЕ ЦЕННЫМ !!

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

var arr = [
  {name: 'rajendra', last: 'arora'},
  {name: 'rajendra', last: 'arora2'},
  {name: 'rajendra1', last: 'arora22'},
  {name: 'rajendra2', last: 'arora233'},
  {name: 'rajendra2', last: 'arora23'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendr3', last: 'arora3'}
];

var resultArr = arr
  .sort((a, b) => a.name-b.name )
  .reduce((accu, curr, i) => {
    let length = accu.length;
    if(length == 0 || accu[length - 1].name !== curr.name) {
      accu.push(curr);
    }
    return accu;
  }, []);

console.log(resultArr);
0 голосов
/ 07 декабря 2018

Вы можете использовать .reduce() и Object.values(), чтобы получить результирующий массив:

let data = [
  {name: 'rajendra', last: 'arora'},    {name: 'rajendra', last: 'arora2'},
  {name: 'rajendra1', last: 'arora22'}, {name: 'rajendra2', last: 'arora233'},
  {name: 'rajendra2', last: 'arora23'}, {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendra3', last: 'arora3'},  {name: 'rajendr3', last: 'arora3'}
];

let result = Object.values(data.reduce((r, c) => (r[c.name] = r[c.name] || c, r), {}));

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

У меня есть небольшие правки для вашего существующего решения:

function _unique(arr) {
  let uniqueArr = [];

  for (var i = 0; i < arr.length; i++) {
    let existed = false
    for (var j = 0; j < uniqueArr.length; j++) 
      if (arr[i].name === uniqueArr[j].name) {
        existed = true
        break
      }

    if (existed) continue
    uniqueArr.push(arr[i])
  }

  return uniqueArr;
}
0 голосов
/ 07 декабря 2018

reduce в объект, индексированный name, присваивая свойству, только если в этом свойстве еще нет элемента, затем получить значения этого объекта:

var arr = [
  {name: 'rajendra', last: 'arora'},
  {name: 'rajendra', last: 'arora2'},
  {name: 'rajendra1', last: 'arora22'},
  {name: 'rajendra2', last: 'arora233'},
  {name: 'rajendra2', last: 'arora23'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendra3', last: 'arora3'},
  {name: 'rajendr3', last: 'arora3'}
];
const output = Object.values(arr.reduce((a, item) => {
  if (!a[item.name]) a[item.name] = item;
  return a;
}, {}));
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...