У меня есть массив хэшей, например:
[{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"}]
Я хочу выбросить повторяющиеся хеши. Set не работает, потому что хэши являются уникальными объектами.
Я чувствую себя застрявшим и нуждаюсь в пинке, чтобы подумать. Пожалуйста, порекомендуйте!
Что пробовали?
Вам нужно будет перебрать массив для каждого возможного хеша и проверить, удалить. Или измените формат данных, используйте объект с хеш-строкой в качестве ключа и именем и всем остальным в качестве отдельного объекта для значения.
Разрешен только чистый JS?
@hindmost, да, это часть моего приложения для реагирования
Вы не можете использовать какую-либо библиотеку с React? например lodash?
Нет не разрешено
@ZiTAL он говорит, что пробовал установить



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это
h.filter(( t = {}, a=>!(t[a.id]=a.id in t) ))
Входной массив в часах, временная сложность На), объяснение здесь.
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.info(JSON.stringify(r));Я бы предложил подход с ассоциативными массивами, это упрощает удаление дубликатов. Если вы можете, вы должны в первую очередь создать свой массив как ассоциативный массив, чтобы вам не приходилось его преобразовывать. Вот как это сделать:
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.info(arrayAssociative);Я не знаю точной причины, почему линия
var element = arrayAssociative[id] =arrayAssociative[id] || {};
работает для этого, но давайте просто примем функциональность такой, какая она есть :)
arrayAssociative[array[item].id] || {} эта строка дает значение слева от ||, если оно не равно null / undefined / 0 / false, или значение справа, если противоположно - stackoverflow.com/q/2100758/860099Место для времени
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.info(rest);Вы также можете использовать уменьшать
//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.info(result);
Сократите массив до объекта, используя идентификатор в качестве ключа, а затем преобразуйте обратно в массив с помощью
Object.values().