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)
}
Здесь каждый раз, когда элементы меняются, элементы массива также меняются. Как я могу сделать массив неизменным без каких-либо изменений в массиве, независимо от того, меняются элементы или нет.
Вопросы должны быть ограничены только одной проблемой. Потратьте несколько минут, чтобы прочитать Как спросить и Контрольный список вопросов о переполнении стека. Что касается № 1, это легко исследовать, и перед тем, как спрашивать, ожидаются базовые исследования. # 2 требуется больше контекста кода и лучшее описание проблемы вместе с минимальный воспроизводимый пример
Добавьте все элементы в качестве ключей на карту. Его ключи представляют собой массив без дубликатов



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


Вы можете проверить, существует ли элемент, прежде чем использовать 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», в значительной степени является ответом.
Array.prototype используется не только в вашем собственном коде. Изменение нативных прототипов никогда не бывает хорошей идеей, если только вы не пишете полифилл.
Можете ли вы представить себе ситуацию, когда значения в Array.prototype, которые не ожидаются другими библиотеками, будут изменены? Если это так, я с радостью отредактирую или удалю свой ответ соответственно. Если бы это было для OSS, то я бы в основном согласился с вами, но, похоже, это не так.
Допустим, pushUnique добавляется языком, но с другим поведением. Или у другой библиотеки есть отличная идея изменить Array.prototype и добавить функцию pushUnique, найденную на Stack Overflow! Вы видите шаблон.
Вот как вы можете это сделать. Конечно, кто-то скажет, что вы можете расширить прототип 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);
Я знаю, что вы основываете свой ответ на предположении, что массив предварительно заполнен, но я думаю, что было бы лучше, если бы мы проверяли дубликаты, прежде чем первоначально добавлять их в основной массив, поскольку вышеуказанное решение будет дорогостоящим, если массив имеет достаточное количество значений .
Покажите, что вы пробовали.