Получить все уникальные значения в массиве JavaScript (удалить дубликаты)

Ниже приведен поток с хорошим обсуждением этого вопроса.

Короче говоря, компилятор предупреждает вас, что, по сути, ваш экспортированный класс не отделяет интерфейс от реализация. Если члены, о которых идет речь, не доступны для клиентов, сделайте их закрытыми и #pragma покиньте предупреждение для этого члена / класса. Если участники доступны и используются клиентами, вам необходимо будет предоставить косвенный доступ к членам через аксессуар и мутаторы.

1149
задан APerson 19 July 2018 в 00:25
поделиться

6 ответов

Array.prototype.getUnique = function() {
    var o = {}, a = []
    for (var i = 0; i < this.length; i++) o[this[i]] = 1
    for (var e in o) a.push(e)
    return a
}
10
ответ дан 19 December 2019 в 20:16
поделиться

Это потому, что 0 является фальшивым значением в JavaScript.

это[i] будет фальшивым, если значение массива равно 0 или любому другому фальшивому значению.

.
10
ответ дан 19 December 2019 в 20:16
поделиться

Этому ответили много, но это не обратилось к моей конкретной потребности.

Много ответов похожи на это:

a.filter((item, pos, self) => self.indexOf(item) === pos);

, Но это не работает на массивы сложных объектов.

Говорят, что у нас есть массив как это:

const a = [
 { age: 4, name: 'fluffy' },
 { age: 5, name: 'spot' },
 { age: 2, name: 'fluffy' },
 { age: 3, name: 'toby' },
];

, Если мы хотим объекты с уникальными именами, мы должны использовать array.prototype.findIndex вместо array.prototype.indexOf:

a.filter((item, pos, self) => self.findIndex(v => v.name === item.name) === pos);
4
ответ дан 19 December 2019 в 20:16
поделиться

Не цитируйте меня, но я думаю, что вам нужно использовать строку для имени вашего свойства, например, o[e.toString()], а затем преобразовывать ее обратно, когда вы нажимаете на нее.

.
0
ответ дан 19 December 2019 в 20:16
поделиться

Много людей уже упомянуло, что использовало...

[...new Set(arr)];

И это - отличное решение, но мое предпочтение является решением, которое работает с .filter. По-моему, фильтр является более естественным способом получить уникальные значения. Вы эффективно удаляете дубликаты и удаляете элементы из массива, точно, для чего предназначен фильтр. Это также позволяет Вам отмерить .map, .reduce и другой .filter вызовы. Я создал это решение...

const unique = () => {
  let cache;  
  return (elem, index, array) => {
    if (!cache) cache = new Set(array);
    return cache.delete(elem);
  };
};

myArray.filter(unique());

протест состоит в том, что Вам нужно закрытие, но я думаю, что это - достойный компромисс. С точки зрения производительности это более производительно, чем другие решения, которые я видел отправленный, которые используют .filter, но худшее выполнение, чем [...new Set(arr)].

См. также мой пакет GitHub youneek

0
ответ дан 19 December 2019 в 20:16
поделиться

Простое решение, если Вы хотите проверить уникальные значения †‹вЂ‹ в неопределенном количестве параметров с помощью es6.

function uniteUnique(arr, ...rest) {
      const newArr = arr.concat(rest).flat()
      return [...new Set(newArr)]
   }

console.log(uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]))
console.log(uniteUnique([1, 2, 3], [5, 2, 1]))

я надеюсь, что это будет полезно для кого-то.

0
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: