Ниже приведен поток с хорошим обсуждением этого вопроса.
Короче говоря, компилятор предупреждает вас, что, по сути, ваш экспортированный класс не отделяет интерфейс от реализация. Если члены, о которых идет речь, не доступны для клиентов, сделайте их закрытыми и #pragma
покиньте предупреждение для этого члена / класса. Если участники доступны и используются клиентами, вам необходимо будет предоставить косвенный доступ к членам через аксессуар и мутаторы.
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
}
Это потому, что 0
является фальшивым значением в JavaScript.
это[i]
будет фальшивым, если значение массива равно 0 или любому другому фальшивому значению.
Этому ответили много, но это не обратилось к моей конкретной потребности.
Много ответов похожи на это:
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);
Не цитируйте меня, но я думаю, что вам нужно использовать строку для имени вашего свойства, например, o[e.toString()]
, а затем преобразовывать ее обратно, когда вы нажимаете на нее.
Много людей уже упомянуло, что использовало...
[...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
Простое решение, если Вы хотите проверить уникальные значения †‹вЂ‹ в неопределенном количестве параметров с помощью 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]))
я надеюсь, что это будет полезно для кого-то.