Удалить дубликат из массива внутри массива

1 - В следующем фрагменте кода мой массив содержит следующие элементы некоторые элементы дублируются, и все они являются массивами внутри массива

arr[0] = ["Family Practice"]
arr[1] = ["Family Practice", "General Practice"]
arr[2] = ["Family Practice", "General Practice", "Geriatrics"]
arr[3] = ["Family Practice"]

Как я могу удалить дубликаты и вернуть уникальные элементы в массиве.

2 - При добавлении элементов в массив с помощью push for ex.

function(items) {
    arr.push(items)
}

Здесь каждый раз, когда элементы меняются, элементы массива также меняются. Как я могу сделать массив неизменным без каких-либо изменений в массиве, независимо от того, меняются элементы или нет.

Покажите, что вы пробовали.

Jordan Soltman 01.04.2019 03:15

Вопросы должны быть ограничены только одной проблемой. Потратьте несколько минут, чтобы прочитать Как спросить и Контрольный список вопросов о переполнении стека. Что касается № 1, это легко исследовать, и перед тем, как спрашивать, ожидаются базовые исследования. # 2 требуется больше контекста кода и лучшее описание проблемы вместе с минимальный воспроизводимый пример

charlietfl 01.04.2019 03:18

Добавьте все элементы в качестве ключей на карту. Его ключи представляют собой массив без дубликатов

Juan Mendes 01.04.2019 03:20
Поведение ключевого слова "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) для оценки ваших знаний,...
6
3
113
2

Ответы 2

Вы можете проверить, существует ли элемент, прежде чем использовать push. Есть много способов приблизиться к этому, но простым решением может быть:

Array.prototype.pushUnique = function pushUnique(item) {
  if (this.indexOf(item) === -1) {
    this.push(item);
  }
}

// Then use it...
const arr = [];

arr.pushUnique("Family Practice");
// arr = ["Family Practice"]

arr.pushUnique("General Practice");
// arr = ["Family Practice", "General Practice"]

arr.pushUnique("Family Practice");
// arr = ["Family Practice", "General Practice"]

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

@EmileBergeron да, я бы согласился, если бы я говорил об обновлении существующего метода, но даже в сообщении, которым вы поделились, говорится: «Изменение поведения объекта, который будет использоваться только вашим собственным кодом, — это нормально». Это подходит под это описание. При желании вы также можете создать подкласс, но мой комментарий в конце о том, что «просто используйте indexOf или include», в значительной степени является ответом.

Eric T 02.04.2019 16:36
Array.prototype используется не только в вашем собственном коде. Изменение нативных прототипов никогда не бывает хорошей идеей, если только вы не пишете полифилл.
Emile Bergeron 02.04.2019 16:45

Можете ли вы представить себе ситуацию, когда значения в Array.prototype, которые не ожидаются другими библиотеками, будут изменены? Если это так, я с радостью отредактирую или удалю свой ответ соответственно. Если бы это было для OSS, то я бы в основном согласился с вами, но, похоже, это не так.

Eric T 03.04.2019 19:22

Допустим, pushUnique добавляется языком, но с другим поведением. Или у другой библиотеки есть отличная идея изменить Array.prototype и добавить функцию pushUnique, найденную на Stack Overflow! Вы видите шаблон.

Emile Bergeron 03.04.2019 19:25

Вот как вы можете это сделать. Конечно, кто-то скажет, что вы можете расширить прототип Array, чтобы он был везде, но это будет ваш выбор. Это решение не изменяет существующие типы.


var arr  = [];

    arr[0] = ["Family Practice"]
    arr[1] = ["Family Practice", "General Practice"]
    arr[2] = ["Family Practice", "General Practice", "Geriatrics"]
    arr[3] = ["Family Practice"]

function makeUunique (collection) {
    return collection.reduce(function(rv,item) {
        if (!rv.includes(item)) {
            rv.push(item);
        }
        return rv;
    },[]);
};

var unique = makeUunique(arr.reduce(function(rv,item) {
    rv = rv.concat(item);
    return rv;
},[]));

console.info(unique);

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

Michel Hanna 01.04.2019 04:01

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