Фильтрация повторяющихся хэшей из массива хэшей - Javascript

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

[{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 не работает, потому что хэши являются уникальными объектами.

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

Сократите массив до объекта, используя идентификатор в качестве ключа, а затем преобразуйте обратно в массив с помощью Object.values().

Ori Drori 21.12.2018 10:44

Что пробовали?

ZiTAL 21.12.2018 10:45

Вам нужно будет перебрать массив для каждого возможного хеша и проверить, удалить. Или измените формат данных, используйте объект с хеш-строкой в ​​качестве ключа и именем и всем остальным в качестве отдельного объекта для значения.

Patrick Evans 21.12.2018 10:46

Разрешен только чистый JS?

hindmost 21.12.2018 10:49

@hindmost, да, это часть моего приложения для реагирования

Dende 21.12.2018 10:52

Вы не можете использовать какую-либо библиотеку с React? например lodash?

hindmost 21.12.2018 10:53

Нет не разрешено

Dende 21.12.2018 10:55

@ZiTAL он говорит, что пробовал установить

user5940189 21.12.2018 13:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
8
1 021
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуй это

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
Kamil Kiełczewski 21.12.2018 11:03

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

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);

Другие вопросы по теме