Фильтрация дублирующихся хешей из массива хешей - Javascript - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть массив хэшей, например:

[{id: "4bf58dd8d48988d110941735", name: "italy"},
 {id: "4bf58dd8d48988d1c6941735", name: "skandi"},
 {id: "4bf58dd8d48988d147941735", name: "diner"},
 {id: "4bf58dd8d48988d110941735", name: "italy"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"},
 {id: "4bf58dd8d48988d14a941735", name: "vietnam"},
 {id: "4bf58dd8d48988d1ce941735", name: "fish"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"}]

Я хочу выбросить дубликаты хэшей.Набор не работает, потому что хеши - это уникальные объекты.

Я чувствую себя застрявшим и мне нужно подумать.Пожалуйста, сообщите!

Ответы [ 4 ]

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

Вы можете использовать уменьшить слишком

//I added comma to each object
const data= [{id: "4bf58dd8d48988d110941735", name: "italy"},
    {id: "4bf58dd8d48988d1c6941735", name: "skandi"},
    {id: "4bf58dd8d48988d147941735", name: "diner"},
    {id: "4bf58dd8d48988d110941735", name: "italy"},
    {id: "4bf58dd8d48988d1c4941735", name: "resto"},
    {id: "4bf58dd8d48988d14a941735", name: "vietnam"},
    {id: "4bf58dd8d48988d1ce941735", name: "fish"},
    {id: "4bf58dd8d48988d1c4941735", name: "resto"},
    {id: "4bf58dd8d48988d1c4941735", name: "resto"}]

const result= data.reduce((current,next)=>{   
    if(!current.some(a=> a.name === next.name)){
        current.push(next);
    }
    return current;
},[])
console.log(result);
0 голосов
/ 21 декабря 2018

Я бы предложил подход с ассоциативными массивами, это облегчает удаление дубликатов.Если вы можете, вы должны сначала построить свой массив как ассоциативный массив, чтобы вам не приходилось преобразовывать его.Вот как вы это делаете:

var array = [{
    id: "4bf58dd8d48988d110941735",
    name: "italy"
  },
  {
    id: "4bf58dd8d48988d1c6941735",
    name: "skandi"
  }, {
    id: "4bf58dd8d48988d147941735",
    name: "diner"
  }, {
    id: "4bf58dd8d48988d110941735",
    name: "italy"
  }, {
    id: "4bf58dd8d48988d1c4941735",
    name: "resto"
  }, {
    id: "4bf58dd8d48988d14a941735",
    name: "vietnam"
  }, {
    id: "4bf58dd8d48988d14a941735",
    name: "fish"
  }, {
    id: "4bf58dd8d48988d1c4941735",
    name: "resto"
  }, {
    id: "4bf58dd8d48988d1c4941735",
    name: "resto"
  }
];

// you can access the array with arrayAssociative[id], where the id is the real id like "4bf58dd8d48988d110941735"
var arrayAssociative = {};
for (item in array) {
  // first get the unique id's
  var addedNode = arrayAssociative[array[item].id] = arrayAssociative[array[item].id] || {};
  if (addedNode.names == null)
    addedNode.names = {};
  // now get the unique names
  var addedName = arrayAssociative[array[item].id].names[array[item].name] = arrayAssociative[array[item].id].names[array[item].name] || {};
}
console.log(arrayAssociative);

Я не знаю точную причину, почему строка

var element = arrayAssociative [id] = arrayAssociative [id] ||{};

работает для этого, но давайте просто примем функциональность как есть:)

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

Пространство для времени

let arr = [
    { id: '4bf58dd8d48988d110941735', name: 'italy' },
    { id: '4bf58dd8d48988d1c6941735', name: 'skandi' },
    { id: '4bf58dd8d48988d147941735', name: 'diner' },
    { id: '4bf58dd8d48988d110941735', name: 'italy' },
    { id: '4bf58dd8d48988d1c4941735', name: 'resto' },
    { id: '4bf58dd8d48988d14a941735', name: 'vietnam' },
    { id: '4bf58dd8d48988d1ce941735', name: 'fish' },
    { id: '4bf58dd8d48988d1c4941735', name: 'resto' },
    { id: '4bf58dd8d48988d1c4941735', name: 'resto' }
]

let map = {};
let rest = arr.filter((item) => {
    if(map[item.id] === void 0) {
        map[item.id] = item.id;
        return true;
    }
});
map = null;

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

Попробуйте это

h.filter(( t={}, a=>!(t[a.id]=a.id in t) ))

Входной массив в ч, сложность времени O (n) , объяснение здесь .

let h = [{id: "4bf58dd8d48988d110941735", name: "italy"},
 {id: "4bf58dd8d48988d1c6941735", name: "skandi"},
 {id: "4bf58dd8d48988d147941735", name: "diner"},
 {id: "4bf58dd8d48988d110941735", name: "italy"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"},
 {id: "4bf58dd8d48988d14a941735", name: "vietnam"},
 {id: "4bf58dd8d48988d1ce941735", name: "fish"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"},
 {id: "4bf58dd8d48988d1c4941735", name: "resto"}]
 
 let t; // declare t to avoid use global (however works without it too)
 let r= h.filter(( t={}, a=>!(t[a.id]=a.id in t) ))

 
 console.log(JSON.stringify(r));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...