Убрать повторяющие элементы в объекте

174
13 июля 2019, 15:00

Нужно убрать с объекта повторяющие имена и вывести его Должно выводить объект без 1 Beyonce а не выводит ничего Если добавить массив то работает а с объектом не хочет

var arrayOfObjects = [    
  { 
      name: 'Diana', 
      born: 130000, // Mon, Jul 15 2013 
      num: 4, 
      sex: 'female' 
  }, 
  { 
 
      name: 'Beyonce', 
      born: 1363000, // Wed, Apr 24 2013 
      num: 2, 
      sex: 'female' 
  }, 
  { 
 
    name: 'Beyonce', 
    born: 1363000, // Wed, Apr 24 2013 
    num: 2, 
    sex: 'female' 
}, 
  {             
      name: 'Albert', 
      born: 13000, // Mon, Jun 3 2013 
      num: 3, 
      sex: 'male' 
  },     
  { 
      name: 'Doris', 
      born: 187000, // Sat, Dec 1 2012 
      num: 1, 
      sex: 'female' 
  } 
]; 
 
 
var names = arrayOfObjects.slice(0); 
var eeee= names.filter(function(item, pos) { 
   
    return   names.indexOf(item.name) == pos; 
     
}) 
console.log(eeee);

Answer 1

indexOf сравнивает переданный параметр со всем элементом, так как ты передаешь строку, а элементы это массивы, то ничего не находится, возвращается -1 и так как pos не может быть -1 всегда возвращается false.

для решения достаточно заменить indexOf, на findIndex, который принимает функцию.

var arrayOfObjects = [{ 
    name: 'Diana', 
    born: 130000, // Mon, Jul 15 2013 
    num: 4, 
    sex: 'female' 
  }, 
  { 
 
    name: 'Beyonce', 
    born: 1363000, // Wed, Apr 24 2013 
    num: 2, 
    sex: 'female' 
  }, 
  { 
 
    name: 'Beyonce', 
    born: 1363000, // Wed, Apr 24 2013 
    num: 2, 
    sex: 'female' 
  }, 
  { 
    name: 'Albert', 
    born: 13000, // Mon, Jun 3 2013 
    num: 3, 
    sex: 'male' 
  }, 
  { 
    name: 'Doris', 
    born: 187000, // Sat, Dec 1 2012 
    num: 1, 
    sex: 'female' 
  } 
]; 
 
 
var names = arrayOfObjects.slice(0); 
var eeee = names.filter(function(item, pos) { 
 
  return names.findIndex(el => el.name == item.name) == pos; 
 
}) 
console.log(eeee);

Альтернативным решением может стать проверка наличия конкретного имени, в каком-то на наборе и при его отсутствии добавление и сохранение элемента в результат.

Например:

var arrayOfObjects = [{ 
    name: 'Diana', 
    born: 130000, // Mon, Jul 15 2013 
    num: 4, 
    sex: 'female' 
  }, 
  { 
 
    name: 'Beyonce', 
    born: 1363000, // Wed, Apr 24 2013 
    num: 2, 
    sex: 'female' 
  }, 
  { 
 
    name: 'Beyonce', 
    born: 1363000, // Wed, Apr 24 2013 
    num: 2, 
    sex: 'female' 
  }, 
  { 
    name: 'Albert', 
    born: 13000, // Mon, Jun 3 2013 
    num: 3, 
    sex: 'male' 
  }, 
  { 
    name: 'Doris', 
    born: 187000, // Sat, Dec 1 2012 
    num: 1, 
    sex: 'female' 
  } 
]; 
 
 
var eeee = arrayOfObjects.reduce(function({ 
  map, 
  res 
}, el) { 
 
  if (!map[el.name]) { // если элемента с таким именем не было добавляем в результат 
    map[el.name] = true; // помечаем что такой элемент был 
    res.push(el); 
  } 
  return { 
    map, 
    res 
  }; 
 
}, { 
  map: {}, 
  res: [] 
}).res; 
console.log(eeee);

READ ALSO
Как реализовать такой фон

Как реализовать такой фон

Недавно "прогуливаясь" по интернету нашел такой сайт Приватный чит для DOTA 2, вы не подумайте игра меня не интересует, меня заинтересовал фон...

172
Electron: установить origin окна

Electron: установить origin окна

Нужно сделать всплывающее окно с reCAPTCHAРекапча ругается на origin окна

155
как изменить функцию что бы она принимала разные аргументы

как изменить функцию что бы она принимала разные аргументы

Счас она выдает по firstName с удалением повторяемых, а надо еще чтобы с age выдавалоИли как изменить чтобы от tName она везде в функции принимало...

141
Ошибка 405 Method not Allowed во время axios post Laravel

Ошибка 405 Method not Allowed во время axios post Laravel

Вот решил выучить Vuejs и Laravel

149